列表理解双循环用if

时间:2015-10-05 10:46:18

标签: python list list-comprehension

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

我希望布尔列表指定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]

2 个答案:

答案 0 :(得分:2)

返回生成器对象的原因是因为你使用(),因此那些生成生成器表达式,在迭代它们之前不会对它们进行求值。

如果简单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]

另外,根据你的问题 -

  

我想布尔列表指定A的元素是否等于B的元素。

如果你真正想要的是一个布尔值(而不是10),那么你可以简单地将上面的例子更改为 -

示例1 -

res = [x in A for x in B]

示例2 -

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

答案 1 :(得分:0)

我认为你要找的是两套的交叉点,对吗?

这是两组的交集(我强烈建议你下次提出更好的名字):

A = [1, 2, 3, 5, 7, 10, 12, 9]

B = [2, 6, 7]

print [x if x in B else None for x in A]

你需要"否则"在那里或它没有工作。

从字面上解决你的问题:

 res = [True if x in A else False for x in B]

我建议你查看这个答案:if/else in Python's list comprehension?