我有这个代码,它需要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
答案 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]