测试所有值是否以pythonic方式迭代

blu*_*inc 23 python if-statement

我目前正在这样做:

if x in a and y in a and z in a and q in a and r in a and s in a:
    print b
Run Code Online (Sandbox Code Playgroud)

是否有更多的pythonic方式来表达这种if说法?

Bas*_*els 29

使用all函数可以以一种漂亮而紧凑的方式编写它:

if all(i in a for i in (x, y, z, q, r, s)):
    print b
Run Code Online (Sandbox Code Playgroud)

这段代码应该与您的示例几乎完全相同,即使对象不可散列或者a对象有一些有趣的__contains__方法.该all功能也具有与原始问题中的链类似的短路行为and.在元组(或列表)中收集要测试的所有对象将保证与原始问题中的测试执行顺序相同.如果您使用集合,则订单可能是随机的.

  • 挑剔:这不是*完全等同于OP代码,即使`all`是懒惰的.问题是元组`(x,y,z,q,r,s)`在运行任何迭代之前完全构建,如果`x`,`y`等是表达式,其中一些可能引发异常.在这种情况下,OP的代码*可以*返回"False"并避免异常,而此代码将始终引发异常. (5认同)
  • "一些有趣的`__contains__`方法" - 所以我们到达了鸭子打字的棘手角落.提问者说"在一个可迭代的"中,但是如果`a`实现了`__contains__`那么对于提问者的代码来说,'a`是否是可迭代的并不重要...... (2认同)
  • @Bakuriu,但他们不是表达.它们是变量 - 假设OP正在编写Python,而不是meta-Python. (2认同)

Tha*_*all 18

另一种方法是使用子集:

if {x, y, z, q, r, s}.issubset(a):
    print(b)
Run Code Online (Sandbox Code Playgroud)

REPL示例:

>>> {0, 1, 2}.issubset([0, 1, 2, 3])
True
>>> {0, 1, 2}.issubset([1, 2, 3])
False
Run Code Online (Sandbox Code Playgroud)

这种方法的一个需要注意的是,所有的x,y,z等一定要哈希的.


rig*_*old 7

if all(v in a for v in {x, y, z, q, r, s}):
    print(b)
Run Code Online (Sandbox Code Playgroud)