获取列表中不重复的项目

时间:2009-06-30 09:57:35

标签: python

取两个列表,第二个列表与第一个相同,加上更多:

a = [1,2,3]
b = [1,2,3,4,5]

我想得到第三个,只包含新项目(未重复的项目):

c = [4,5]

我现在的解决方案是:

>>> c = []
>>> for i in ab:
...   if ab.count(i) == 1:
...     c.append(i)
>>> c
[4, 5]

还有其他比这更pythonic的方法吗?

Thanx人!

7 个答案:

答案 0 :(得分:12)

至少使用列表理解:

[x for x in a + b if (a + b).count(x) == 1]

否则使用set类:

list(set(a).symmetric_difference(set(b)))

还有一种更紧凑的形式:

list(set(a) ^ set(b))

答案 1 :(得分:8)

如果订单不重要且您可以忽略ab内的重复,我只会使用集合:

>>> set(b) - set(a)
set([4, 5])

集合是可迭代的,因此大多数情况下您不需要将它们显式转换回列表。如果必须,这样做:

>>> list(set(b) - set(a))
[4, 5]

答案 2 :(得分:4)

b中不在a中的项目,如果您需要保留b中的顺序或重复项:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3, 4, 4, 5]
>>> a_set = set(a)
>>> [x for x in b if x not in a_set]
[4, 4, 5]

b中不属于a,不保留顺序且不保留b中重复项的项目:

>>> list(set(b) - set(a))
[4, 5]

答案 3 :(得分:3)

我想去设置变体,其中

  set(b) ^ set(a)   (set.symmetric_difference())

仅适用于您可以确定a始终是b的子集,但在这种情况下具有可交换的优势,即。你不必担心计算set(b)^ set(a)或set(a)^ set(b);或

  set(b) - set(a)    (set.difference())

更接近地匹配你的描述,允许a有不在b中的额外元素,这些元素不在结果集中,但是你必须要记住顺序(set(a) - set(b)会给你一个不同的结果)。

答案 4 :(得分:1)

以下是集合

的一些不同可能性
>>> a = [1, 2, 3, 4, 5, 1, 2]
>>> b = [1, 2, 5, 6]
>>> print list(set(a)^set(b))
[3, 4, 6]
>>> print list(set(a)-set(b))
[3, 4]
>>> print list(set(b)-set(a))
[6]
>>> print list(set(a)-set(b))+list(set(b)-set(a))
[3, 4, 6]
>>>

答案 5 :(得分:0)

另一种仅使用列表的解决方案:

a = [1, 2, 3]
b = [1, 2, 3, 4, 5]
c = [n for n in a + b if n not in a or n not in b]

答案 6 :(得分:0)

a = [1, 2 ,3]
b = [1, 2, 3, 4, 5]
c=[]

for x in a:
   if x not in b:
      c.append(x)

print(c)