Python中包含重复项的两个列表之间的差异

31 投票
6 回答
20602 浏览
提问于 2025-04-17 06:10

我有两个列表,这两个列表里有很多相同的东西,还有重复的项。我想检查一下,第一个列表里哪些东西不在第二个列表里。例如,我可能有一个列表是这样的:

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

还有一个列表是这样的:

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

对比这两个列表,我想得到一个第三个列表,内容是这样的:

l3 = ['c']

我现在用的是一些很糟糕的代码,之前写的,我觉得根本就不太好使,下面是代码:

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

我该怎么做才能更好地完成这个任务呢?

6 个回答

6

为了同时考虑重复元素和元素的顺序:

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

示例

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

这是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
9

为两个列表创建一个叫做 Counter 的工具,然后用 subtract 方法把一个列表的内容减去另一个列表的内容。

from collections import Counter

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

c = Counter(a)
c.subtract(Counter(b))
57

你没有说明顺序是否重要。如果顺序不重要的话,你可以在 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())

撰写回答