带有 if 的列表理解双循环
List comprehension double loop with if
我有两个列表 A
和 B
其中 B
是 A
的超集。
我想要指定 A
的元素是否等于 B
的元素的布尔列表。超集列表 B
是有序的。
如果试过这个:
res = [(1 for a in A if a is b) for b in B]
根据其他答案,这应该可行。但在我的例子中,它是 returns 一个生成器列表。我怎样才能得到一个普通列表。类似于:
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
运算符来比较 A
和 B
的元素。然后你可以使用 any()
函数遍历生成器表达式和 return 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.
如果您真正想要的是布尔值(而不是 1
或 0
),那么您只需将上面的示例更改为 -
示例 1 -
res = [x in A for x in B]
示例 2 -
res = [any(a is b for a in A) for b in B]
我想你要找的是两组的交集吧?
这是两组的交集(我强烈建议你下次想出更好的名字):
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]
你需要里面的 "else" 否则它不起作用。
并从字面上解决您的问题:
res = [True if x in A else False for x in B]
我建议您查看此答案:if/else in Python's list comprehension?
我有两个列表 A
和 B
其中 B
是 A
的超集。
我想要指定 A
的元素是否等于 B
的元素的布尔列表。超集列表 B
是有序的。
如果试过这个:
res = [(1 for a in A if a is b) for b in B]
根据其他答案,这应该可行。但在我的例子中,它是 returns 一个生成器列表。我怎样才能得到一个普通列表。类似于:
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
运算符来比较 A
和 B
的元素。然后你可以使用 any()
函数遍历生成器表达式和 return 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.
如果您真正想要的是布尔值(而不是 1
或 0
),那么您只需将上面的示例更改为 -
示例 1 -
res = [x in A for x in B]
示例 2 -
res = [any(a is b for a in A) for b in B]
我想你要找的是两组的交集吧?
这是两组的交集(我强烈建议你下次想出更好的名字):
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]
你需要里面的 "else" 否则它不起作用。
并从字面上解决您的问题:
res = [True if x in A else False for x in B]
我建议您查看此答案:if/else in Python's list comprehension?