loops - 如果 list(a) 中的项存在于列表( b ) 中,python 通过更大的list(b) 迭代 list(a) 以给出 true/false 值

  显示原文与译文双语对照的内容
88 5

我有两个名单:

a = ['A', 'B', 'C', 'D']
b = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

我想检查列表A,如果列表A 中的一个项目存在于列表B 中,我得到一个 true 结果,如果不是。i.e.

c = [False, True, True, True]

我已经尝试了以下操作:

c = [False for i in range(len(a))]
for i in a:
 for j in b:
 if a[i] == b[j]:
 c[i] = True

我收到错误:

TypeError: 列表索引必须是整数,而不是 str

我也尝试过:

c = [True for i in a if i in b ]

返回:

c = [True, True ]

我想要正确的答案

c = [False, True, True ]

时间:原作者:0个回答

137 5
a = ['A', 'B', 'C', 'D'] 
b = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
c = [x in b for x in a]
原作者:
100 2

你可以以更易读的方式执行 list comprehension:

a = ['A', 'B', 'C', 'D']
b = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
c = [True if element in b else False for element in a]
print(c)
# [False, True, True, True]
原作者:
96 5

set在 https://docs.python.org/3.6/library/stdtypes.html#set-types-set-frozenset 中非常有用:

# gives you a set of elements that are common for both lists.
intersect = set(a) & set(b)
c = [x in intersect for x in a] 
原作者:
114 2

执行这里操作的Pythonic 方法是[x in b for x in a],如 @Dan 和 @Aritesh. 所建议

如果你想检查集合是否具有特定值,那么 in 操作符检查成员身份,通常是你想要使用的。它将给你一个布尔值。

l = ['A', 'B', 'C']
print('A' in l) # True
print('Z' in l) # False

如果然后将这个与列表理解一起,就得到一种非常简洁的方法来表达你想要的。

a = ['A', 'B', 'C', 'D']
b = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
c = [x in b for x in a]
print(c) # [False, True, True, True]
大列表

如果你正在检查的列表很小,那么上面的代码很好地工作。然而,一旦你开始检查以上数百万元素的列表,你会注意到上面的代码将变得非常慢。因为 python 必须查看每个元素,才能查明元素在列表中是否在列表中。因这里,python 可以能需要做百万个比较操作,因这里对于一个包含百万元元素的列表。

为了加快速度,你可以使用一个集。集合使用哈希表 are,而哈希表的最大内容是,查找的时间大致相同。即使有数百万元素,它们都是 super 快速。你可以像这样使用它们:

a = ['A', 'B', 'C', 'D']
b = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
b_set = set(b)
c = [x in b_set for x in a]

更好的是,如果 b 不必是一个列表,就可以以将它定义为一个集合。这将节省将列表转换为集合的额外步骤,如果你有大量的元素,则会缓慢。

a = ['A', 'B', 'C', 'D']
b = {'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'}
c = [x in b for x in a]
原作者:
...