所以这是一个普通的any()方法,检查iterable是否在其任何元素中返回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()方法中组合这两个迭代器?
答案 0 :(得分:1)
不确定你想要什么,但这更简单:
any(name == item for item in list_a + list_b)
从对象获取属性值:
any([any(name==item.get_value() for item in list1), any(name==item.obtain_value() for item in list2)])
它失去了简化因素,所以它并没有真正解决你的问题 它保留了懒惰的评估短路。
答案 1 :(得分:1)
any
接受单个可迭代。对于简单列表,您可以执行
any(['hello'=word for word in list1 + list2])
对于其他类型的迭代器,您可以使用itertools.chain
从它们生成单个迭代。
在你的情况下,最简单的事情似乎是
if 'hello' in list1 + list2
答案 2 :(得分:1)
将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