所以这是一个正常的any()方法,检查可迭代对象是否在其任何元素中返回True:
list_a = ['test', 'hello']
list_b = ['test', 'bye']
name = 'test'
any(name == item for item in list_a)
True
但是,将两个可迭代对象组合在一起呢?
这有效:
name = 'hello'
any(name == item_a for item_a in list_a or name == item_b for item_b in list_b)
True
这不会:
name = 'bye'
any(name == item_a for item_a in list_a or name == item_b for item_b in list_b)
False
这可以简单地简化为:
any([True] or [False]) vs any([False] or [True])
如何将其转换为:
any([True, False]) or any([False, True])
有什么方法可以在 any() 方法中组合这两个迭代器?
list_a
具有False
真实值的内容设置片刻有助于揭示您的第一种方法存在的问题:
list_a = []
any(name == item_a for item_a in list_a or name == item_b for item_b in list_b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'item_b' is not defined
这应该有助于说服您any
行的解释如下
any(name == item_a for item_a in (list_a or name == item_b) for item_b in list_b)
由于or
短路和list_a
在原始示例中True
,因此or name == item_b
在那里不起作用。
可以通过or
两个any
语句或itertools.chain
any
的操作数来实现所需的行为
import itertools as it
name = 'bye'
any(it.chain((name==item_a for item_a in list_a), (name==item_b for item_b in list_b)))
# True
any
接受单个可迭代对象。对于简单的列表,您可以只做
any(['hello'=word for word in list1 + list2])
对于其他类型的迭代器,可以使用itertools.chain
从它们生成单个可迭代对象。
然而,在您的情况下,最简单的事情似乎是
if 'hello' in list1 + list2
不确定你到底想要什么,但这更简单:
any(name == item for item in list_a + list_b)
取 2:
从对象获取属性值:
any([any(name==item.get_value() for item in list1), any(name==item.obtain_value() for item in list2)])
它失去了简化因素,因此它并没有真正解决您的问题。
不过,它保留了其惰性评估短路。