我有两个清单:
a = ['A', 'B', 'C', 'D']
b = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
我想针对列表B检查列表A,这样如果列表A中的项目存在于列表B中,我得到True结果,如果不是,则得到False。即
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:list indices必须是整数,而不是str
我也尝试过:
c = [如果i中的i为真,则为b]
返回:
c = [True,True]
我希望得到正确答案
c = [False,True,True]
答案 0 :(得分:4)
a = ['A', 'B', 'C', 'D']
b = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
c = [x in b for x in a]
答案 1 :(得分:3)
您可以以更易读的方式执行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]
答案 2 :(得分:1)
这里的方便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]
答案 3 :(得分:1)
按照@Dan和@Aritesh的建议,Pythonic的方法是使用[x in b for x in a]
。
in
运算符检查成员身份,如果要检查集合是否具有特定值,通常是您要使用的。它会给你一个布尔值。
l = ['A', 'B', 'C']
print('A' in l) # True
print('Z' in l) # False
如果您将其与list comprehension结合使用,您将获得一种非常简洁的方式来表达您想要的内容。
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可能需要进行一百万个比较操作。
为了加快速度,您可以使用set。在底层设置使用hash tables,关于哈希表的好处是查找大致相同的时间量,无论它们有多少元素。即使有数百万个元素,它们也非常快。你会像这样使用它们:
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]