如何在python中使用列表推导中的多个AND条件?

时间:2017-09-10 05:36:52

标签: python list list-comprehension

我有这个代码,它需要2个列表作为输入,并打印第3个列表,其中两个共同元素没有重复。

一种方法是评论for循环,它可以正常工作并给出预期的结果。我试图通过列表理解来实现它,但它提供了重复。

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
c=[]
# for i in a:
#     if i in b and i not in c:
#         c.append(i)

c = [i for i in a if i in b and i not in c ]
print c

预期结果:     [1,2,3,5,8,13]

使用列表推导重复的当前结果:     [1,1,2,3,5,8,13]

我正在使用python 2.7

1 个答案:

答案 0 :(得分:4)

列表在列表推导中构建时,列表无法自行查询。条件i not in c将始终在执行列表comp之前查询c(空列表[])的相同值,因此您的代码不知道是什么在下一个迭代期间插入。

选项1

如果顺序无关紧要,您只需执行set交叉点:

c = set(a) & set(b)
print(list(c))
[1, 2, 3, 5, 8, 13] # Warning! Order not guaranteed

选项2

如果订单很重要,请使用for循环:

c = []
b = set(b)   
for i in a:
     if i in b and i not in c:
         c.append(i)

print(c)
[1, 2, 3, 5, 8, 13]

选项3

由于使用了OrderedDict,上面的版本稍微快一点,保留了订单:

from collections import OrderedDict

b = set(b)
c = list(OrderedDict.fromkeys([i for i in a if i in b]).keys())
print(c)
[1, 2, 3, 5, 8, 13]