如果列表(a)中的项目存在于列表(b)中,则通过更大的列表(b)迭代列表(a)以给出真/假值

时间:2018-03-18 14:05:45

标签: python loops

我有两个清单:

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]

4 个答案:

答案 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]