python - 使用 if 的列表理解双循环

标签 python list list-comprehension

我有两个列表 AB,其中 BA 的超集。

我想要一个 bool 列表,指定 A 的元素是否等于 B 的元素。超集列表 B 是有序的。

如果尝试过这个:

res = [(1 for a in A if a is b) for b in B]

根据其他答案,这应该有效。但就我而言,它返回一个生成器列表。我怎样才能得到一个普通的列表。像这样的东西:

A = ['a', 'b', 'c', 'e']
B = ['a', 'b', 'c', 'd', 'e', 'f']
res = [1, 1, 1, 0, 1, 0]

最佳答案

您获取生成器对象的原因是因为您使用了 () ,因此这些生成器表达式在您迭代它们之前不会被评估。

如果简单的 in 运算符,您真正应该使用什么。示例-

>>> A = ['a', 'b', 'c', 'e']
>>> B = ['a', 'b', 'c', 'd', 'e', 'f']
>>> res = [1 if x in A else 0 for x in B]
>>> res
[1, 1, 1, 0, 1, 0]

如果您的用例更复杂,则必须使用 is 运算符来比较 AB 的元素。然后,您可以使用 any() 函数迭代生成器表达式,如果找到匹配则返回 True ,否则返回 False 。示例-

res = [1 if any(a is b for a in A) else 0 for b in B]

演示 -

>>> A = ['a', 'b', 'c', 'e']
>>> B = ['a', 'b', 'c', 'd', 'e', 'f']
>>> res = [1 if any(a is b for a in A) else 0 for b in B]
>>> res
[1, 1, 1, 0, 1, 0]

另外,根据你的问题 -

I would like boolean list of that specifies whether an element of A is equal to an element of B.

如果您真正想要的是 bool 值(而不是 10),那么您只需将上面的示例更改为 -

示例 1 -

res = [x in A for x in B]

示例 2 -

res = [any(a is b for a in A) for b in B]

关于python - 使用 if 的列表理解双循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32946718/

相关文章:

python - 在python中接受由空格分隔的多个用户输入并将它们附加到列表中

python - mypy 和嵌套的 dict 理解

python - PyQt视频帧更新信号(每个视频帧后触发函数)

python - 如何使用 C API 在 Python 中定义新类型(类)?

python - python中两个列表的比较

asp.net-mvc - MVC 4 列表模型向 Controller 返回 null

python - 如何展开列表理解

loops - 非并行 for 循环/多行推导式的缩减器

python - 从 C 到 Python 的回溯排列

python - 将 Series 转换为 DataFrame