Python中具有重复项的两个列表之间的差异

Pau*_*aul 17 python

我有两个包含许多相同项目的列表,包括重复项目.我想检查第一个列表中的哪些项目不在第二个列表中.例如,我可能有一个这样的列表:

l1 = ['a', 'b', 'c', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

和一个这样的列表:

l2 = ['a', 'b', 'c', 'b']
Run Code Online (Sandbox Code Playgroud)

比较这两个列表,我想返回第三个列表,如下所示:

l3 = ['c']
Run Code Online (Sandbox Code Playgroud)

我目前正在使用一些我之前做过的可怕代码,我相当肯定甚至没有正确显示如下.

def list_difference(l1,l2):
    for i in range(0, len(l1)):
        for j in range(0, len(l2)):
            if l1[i] == l1[j]:
                l1[i] = 'damn'
                l2[j] = 'damn'
    l3 = []
    for item in l1:
        if item!='damn':
            l3.append(item)
    return l3
Run Code Online (Sandbox Code Playgroud)

我怎样才能更好地完成这项任务?

Joc*_*zel 33

您没有说明订单是否重要.如果没有,您可以在> = Python 2.7中执行此操作:

l1 = ['a', 'b', 'c', 'b', 'c']
l2 = ['a', 'b', 'c', 'b']

from collections import Counter

c1 = Counter(l1)
c2 = Counter(l2)

diff = c1-c2
print list(diff.elements())
Run Code Online (Sandbox Code Playgroud)

  • @rotoglup套装不起作用; 有重复的元素会消失,而集合不会保留顺序. (4认同)

Mat*_*ick 7

为两个列表创建计数器,然后subtract从另一个列表创建一个.

from collections import Counter

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

c = Counter(a)
c.subtract(Counter(b))
Run Code Online (Sandbox Code Playgroud)

  • 你可以调用:`c.subtract(b)`(省略计数器).添加`print list(c.elements())`以获得完整性. (2认同)

joa*_*uin 5

计数器是 Python 2.7 中的新功能。对于从 b 中减去 a 的一般解决方案:

def list_difference(b, a):
    c = list(b)
    for item in a:
       try:
           c.remove(item)
       except ValueError:
           pass            #or maybe you want to keep a values here
    return c
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 5

要考虑重复项和元素顺序:

from collections import Counter

def list_difference(a, b):
    count = Counter(a) # count items in a
    count.subtract(b)  # subtract items that are in b
    diff = []
    for x in a:
        if count[x] > 0:
           count[x] -= 1
           diff.append(x)
    return diff
Run Code Online (Sandbox Code Playgroud)

print(list_difference("z y z x v x y x u".split(), "x y z w z".split()))
# -> ['y', 'x', 'v', 'x', 'u']
Run Code Online (Sandbox Code Playgroud)

Python 2.5版本:

from collections import defaultdict 

def list_difference25(a, b):
    # count items in a
    count = defaultdict(int) # item -> number of occurrences
    for x in a:
        count[x] += 1

    # subtract items that are in b
    for x in b: 
        count[x] -= 1

    diff = []
    for x in a:
        if count[x] > 0:
           count[x] -= 1
           diff.append(x)
    return diff
Run Code Online (Sandbox Code Playgroud)