是否有使用 python 内置的列表减法/列表差异函数?我知道如何编写这样的函数,所以无需解释。但是由于这是一种常见的事情,我想知道是否已经内置了这样的功能。
我有两个排序列表,每个可能包含相同元素的多个副本。
我想知道列表之间有什么区别,考虑到出现的次数(设置差异是不够的)
例如:
l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]
diff (l1, l2)
[1,3,5,6]
diff (l2,l1)
[8,9]
是否有使用 python 内置的列表减法/列表差异函数?我知道如何编写这样的函数,所以无需解释。但是由于这是一种常见的事情,我想知道是否已经内置了这样的功能。
我有两个排序列表,每个可能包含相同元素的多个副本。
我想知道列表之间有什么区别,考虑到出现的次数(设置差异是不够的)
例如:
l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]
diff (l1, l2)
[1,3,5,6]
diff (l2,l1)
[8,9]
也许你可以只使用Counter类。
例子:
l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]
from collections import Counter
print Counter(l1) - Counter(l2)
print Counter(l2) - Counter(l1)
结果:
计数器({1:1, 3:1, 5:1, 6:1})
计数器({8:1, 9:1})
编辑:
要从Counter
对象中获取列表,您可以使用以下代码:
from itertools import chain
r = Counter(l2) - Counter(l1)
list(chain(*[p*[k] for k,p in r.items()]))
我只是从类字典中创建一个列表列表Counter
,然后使用list(chain(* ... ))
将其展平为一个列表。
我认为解决方案BigYellowCactus
是完美的。我只是想添加一个如何扩展Counter
为列表的方法:
>>> from itertools import chain
>>> from collections import Counter
>>> a=[1,1,1,1,1,2,3,4,2,2]
>>> b=[1,1,1,2,3]
>>> list(chain(*[[k]*v for (k,v) in (Counter(a)-Counter(b)).items()]))
[1, 1, 2, 2, 4]
使用集
l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]
def diff (list1, list2) :
return list(set(list1).difference(set(list2)))
print diff(l1,l2)
>>>
[3, 5, 6]
我目前正在使用这个:
def listdiff (l1, l2):
for x in l1:
if x in l2:
l1.remove(x)
l2.remove(x)
return l1