如何检查多个变量是否彼此相等,并且等于几个替代常量之一?

How can I check if multiple variables are all equal to each other, and equal to one of several alternative constants?

提问人:Mike 提问时间:3/29/2023 最后编辑:mkrieger1Mike 更新时间:3/29/2023 访问量:197

问:

我只是在学习 Python,正在研究井字游戏问题。当我试图查看一行中的所有项目是否相同时,我最初是通过以下方式完成的:

if board[1] == board[4] == board[7]

这很好用,但我很快意识到我忘了将它们与 X 或 O 进行比较。 所以我试着把它改成这样工作:

if board[1] == board[4] == board[7] == ('X' or 'O')

如果该行包含 X,则此行有效,但如果它包含 O,则无效。如果我去掉 X 部分,只留下 O,那么它对 O 有效。有没有其他方法可以做到这一点,并且仍然将其保持在一行上?

我敢肯定,首先可能有更好的方法可以做到这一点,但我只是想知道为什么这种特定的语法不起作用。

python if 语句 比较

评论

0赞 Kelly Bundy 3/29/2023
为什么要检查?你不知道是谁迈出了最后一步吗?'X' or 'O'

答:

3赞 Samwise 3/29/2023 #1

它不起作用,因为它没有给你一个可以比较多个项目的集合,它只是根据第一个操作数的真实性返回一个值。or

一种选择是将这三个值放入 a 中,然后将该集合与其他集合的元组进行比较:set

if {board[1], board[4], board[7]} in ({'X'}, {'O'}):

如果这三个值相同,则这些值将包含一个元素;测试任意数量的值是否相同的常用方法是将它们放入一个集合中,然后检查该集合的 是否为 1。setlen

如果这三个值相同,并且值为 或 ,则该集合必须特别等于 或 ,并且测试一个事物是否与一堆其他事物中的任何一个相同的常用方法是使用运算符。'X''O'{'X'}{'O'}in

类似的选择是将三个空格组合成一个字符串(而不是一个集合):

if board[1] + board[4] + board[7] in ("XXX", "OOO"):

评论

2赞 Barmar 3/29/2023
我误读了你的代码,它确实有效。虽然并不明显。
0赞 Samwise 3/29/2023
仅当左操作数位于右操作数中时,运算符才返回 true,因此左操作数(由三个板空间组成的集合)需要为 or (构成右操作数的元组的两个元素)才能让运算符返回 true。in{'X'}{'O'}in
0赞 B Remmelzwaal 3/29/2023
不得不说这是一个非常独特的解决方案,尽管最初有点令人困惑。
2赞 Barmar 3/29/2023 #2

您需要用于测试列表中是否有某些内容,而不是 .in==

if board[1] in ('X', 'O') and board[1] == board[4] == board[7]:
1赞 chepner 3/29/2023 #3

你可以

if board[1] == board[4] == board[7] != NOT_X_OR_O:

(where 是你用于空方块的任何字符串),但这不是最易读的表达式。我建议使用其他建议之一,并针对容器显式检查三个相等值之一。NOT_X_OR_O

1赞 Guru Stron 3/29/2023 #4

我只会检查其中一个元素是否在子集中:

if board[1] == board[4] == board[7] and board[1] in {'X', 'O'}:
1赞 mkrieger1 3/29/2023 #5

如果您使用的是 Python 3.10 或更高版本,则可以使用结构模式匹配:

match (board[1], board[4], board[7]):
    case ('X', 'X', 'X') | ('O', 'O', 'O'):
        result = True
    case _:
        result = False

另一方面,通过首先将三个值分配给变量,可以使用简单的表达式在可读性和明显性方面实现类似的效果:

row = (board[1], board[4], board[7])
result = (row == ('X', 'X', 'X') or row == ('O', 'O', 'O'))

(为清楚起见,外括号加)

1赞 slothrop 3/29/2023 #6

这也有效,并且在某些方面最接近您最初的想法:

if board[1] == board[4] == board[7] in {'X', 'O'}:
    ...

这依赖于 in 是一个关系运算符并支持链接的事实,就像 一样,依此类推。==<