Python列表与出现次数的差异

时间:2012-08-02 09:35:23

标签: python list comparison

是否有使用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]

4 个答案:

答案 0 :(得分:8)

也许你可以使用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(* ... ))将其展平为一个列表。

答案 1 :(得分:2)

我认为来自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]

答案 2 :(得分:1)

使用set

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]

答案 3 :(得分:-1)

我目前正在使用它:

def listdiff (l1, l2):
    for x in l1:
        if x in l2:
            l1.remove(x)
            l2.remove(x)
    return l1