我有一组三个变量 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。)
检查它们是否全部相同(1 或 2):
sameness = (x == y == z)
括号是可选的,但我发现它提高了可读性
在我的例子中,该值将增加 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:])
这个怎么样?
x == y == z == 1
您可以使用与您拥有的类似的东西:
sameness = (len({x, y, z}) == 1)
这允许任意数量的变量。 例如:
variables = {x, y, z, a, b, ...}
sameness = (len(variables) == 1)
注意: 创建集合意味着需要对每个变量进行哈希处理,并且需要存储哈希值,但是使用生成器表达式的
all()
是短路的,一次仅跟踪两个值。 因此,除了可读性之外,生成器表达式更加高效。
另一种方式:
sameness = all(e == 1 for e in [x, y, z])
[x,y,z].count(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
有一些更有趣的方法可以以更通用的方式解决这个问题(因为为什么不呢?)
def method_one(*args: int) -> bool:
return max(args) == min(args)
def method_two(*args: int) -> bool:
return sum(args) in (len(args), 0)
如果你有更多变量,这种方式可能是最简洁的,因为每个额外的变量只需要一个额外的
,
:
{x} == {y, z}
(没有
x == y == z
那么快,但是问题要求简洁,而不是要求快。)