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 ]

时间: 原作者:

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]



...