取两个列表,第二个列表与第一个相同,加上更多:
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人!
答案 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)
如果订单不重要且您可以忽略a
和b
内的重复,我只会使用集合:
>>> 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)