在任何内置函数中组合两个可迭代对象



所以这是一个正常的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.chainany的操作数来实现所需的行为

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)])

它失去了简化因素,因此它并没有真正解决您的问题。
不过,它保留了其惰性评估短路。

最新更新