在Python中,需要在保留重复项时比较两个列表中的元素

在Python中,需要在保留重复项时比较两个列表中的元素,python,list,Python,List,我想比较两份清单。我希望在第一个列表中找到第二个列表中没有相应条目的元素(顺序无关紧要): 所以我希望输出是 c = ['hi'] 因为第一个列表中有一个额外的“hi”,而第二个列表中没有 如果我做其中一项,我可以使用列表理解: [x for x in a if x not in b] 这给了我[],这不是我想要的 我尝试过使用set操作符,结果相同,因为该操作将列表的成员减少为唯一性 这似乎是一个简单的操作。我是否需要先枚举列表中的每个元素,然后创建元组进行比较?我需要把它们放进一个计

我想比较两份清单。我希望在第一个列表中找到第二个列表中没有相应条目的元素(顺序无关紧要):

所以我希望输出是

c = ['hi']  
因为第一个列表中有一个额外的“hi”,而第二个列表中没有

如果我做其中一项,我可以使用列表理解:

[x for x in a if x not in b]
这给了我
[]
,这不是我想要的

我尝试过使用
set
操作符,结果相同,因为该操作将列表的成员减少为唯一性

这似乎是一个简单的操作。我是否需要先枚举列表中的每个元素,然后创建元组进行比较?我需要把它们放进一个计数器吗?当我只想对列表中的元素进行简单的比较时,所有这些听起来有点过分了

对象支持多集操作:

>>> from collections import Counter
>>> a = ['hi', 'hi', 'bye', 'hi']
>>> b = ['hi', 'hi', 'bye']
>>> Counter(a) - Counter(b)
Counter({'hi': 1})
从计数器重建列表:

>>> list(counter.elements())
['hi']

无需任何导入,只需使用while循环检查每个项目即可完成:

a = ['hi', 'hi', 'bye', 'hi']
b = ['hi', 'hi', 'bye']
c = []
while a:
    # Get first item (and remove).
    item = a.pop(0)
    if item in b:
        b.remove(item)
    else:
        c.append(item)

print c

我认为最好是添加更多的测试用例,而不是您放置的测试用例,例如,如果
a=[1,2,2,2]和b=[1,2,3,4
?…将
c=[2,2],您的预期输出是什么
?我会循环浏览第二个列表,在第一个列表中找到该元素,然后
pop
它。我认为这实际上是需要循环浏览的第一个列表。请参见下面的我的答案。dang这是一个很好的答案…我不会想到这个解决方案
a = ['hi', 'hi', 'bye', 'hi']
b = ['hi', 'hi', 'bye']
c = []
while a:
    # Get first item (and remove).
    item = a.pop(0)
    if item in b:
        b.remove(item)
    else:
        c.append(item)

print c