检查多个变量是否具有相同的值

问题描述 投票:0回答:10

我有一组三个变量 x、y、z,我想检查它们是否都共享相同的值。就我而言,该值要么是 1,要么是 0,但我只需要知道它们是否都相同。目前我正在使用

if 1 == x and  1 == y and 1 == z: 
    sameness = True

寻找我找到的答案:

if 1 in {x, y, z}:

但是,这操作如下

if 1 == x or  1 == y or 1 == z: 
    atleastOneMatch = True

是否可以检查 x、y 和 z 中是否都有 1? 更好的是,是否有更简洁的方法来检查 x、y 和 z 是否相同?

(如果重要的话,我使用Python 3。)

python python-3.x
10个回答
84
投票

如果您有任意序列,请使用

all()
函数 生成器表达式:

values = [x, y, z]  # can contain any number of values
if all(v == 1 for v in values):

否则,只需对

所有三个变量
使用==

if x == y == z == 1:

如果您只需要知道它们是否都是相同的值(无论是什么值),请使用:

if all(v == values[0] for v in values):

if x == y == z:

8
投票

检查它们是否全部相同(1 或 2):

sameness = (x == y == z)

括号是可选的,但我发现它提高了可读性


3
投票

在我的例子中,该值将增加 1 或 2,但我只需要知道它们是否都相同

是否可以检查 x、y 和 z 中是否都有 1? 更好的是,是否有更简洁的方法来检查 x、y 和 z 是否为相同值?

当然:

x == y == z

相当于

(x == y) and (y == z)

如果您有任意(非零)数量的值要比较:

all(values[0] == v for v in values[1:])

2
投票

这个怎么样?

x == y == z == 1

2
投票

您可以使用与您拥有的类似的东西:

sameness = (len({x, y, z}) == 1)

这允许任意数量的变量。 例如:

variables = {x, y, z, a, b, ...}
sameness = (len(variables) == 1)

注意: 创建集合意味着需要对每个变量进行哈希处理,并且需要存储哈希值,但是使用生成器表达式的

all()
是短路的,一次仅跟踪两个值。 因此,除了可读性之外,生成器表达式更加高效。


1
投票

另一种方式:

sameness = all(e == 1 for e in [x, y, z])

1
投票
[x,y,z].count(1)

将计算有多少个变量的值为 1


1
投票

下面Python中的all()和any()函数就可以达到目的。

all() 充当“AND”:如果任何 ittertable 对象中的所有值都等于给定条件值,则返回 True,否则返回 False。

示例

assert all(b == True for b in [True,True,True,True]) == True
assert all(b == True for b in [False,True,True,True]) == False

any() 充当“OR”:如果任何 ittertable 对象中的任何一个值等于给定条件值,则返回 True,否则返回 False。

示例

assert any(b == True for b in [False,False,False,True]) == True
assert any(b == True for b in [False,False,False,False]) == False

0
投票

有一些更有趣的方法可以以更通用的方式解决这个问题(因为为什么不呢?)

def method_one(*args: int) -> bool:
    return max(args) == min(args)

def method_two(*args: int) -> bool:
    return sum(args) in (len(args), 0)

0
投票

如果你有更多变量,这种方式可能是最简洁的,因为每个额外的变量只需要一个额外的

,

{x} == {y, z}

(没有

x == y == z
那么快,但是问题要求简洁,而不是要求快。)

© www.soinside.com 2019 - 2024. All rights reserved.