比较两个列表并过滤掉重复项

时间:2014-08-20 17:26:39

标签: python list compare

也许这只是精神疲惫,但我不能为我的生活弄明白这一点,即使我在我创建的另一个程序中使用相同的原则..

我有两个清单:

compare_list = [0,1,1,2,3,3,4,7,5,8,9,9]

master_list = [0,1,2,3,4,8,9]

正如您所看到的,两个列表都包含一些相同的数字,而在compare_list中,您的值具有重复的值。

我想要完成的是比较两个列表,如果在master_list中找到它,则从compare_list中删除。

这是我到目前为止的代码:

for x in compare_list:
    for y in master_list:
        if x == y:
            compare_list.remove(x)

结果是我确实从compare_list中删除了一些项目,但我仍然留下了一些副本..

输出:

  print(compare_list)

 [1,3,7,5,9]

如何从master_list删除所有重复项实例。所以compare_list只包含在master_list中找不到的数字?

4 个答案:

答案 0 :(得分:1)

似乎是filter

的直接用例
>>> compare_list = [0,1,1,2,3,3,4,7,5,8,9,9]
>>> master_list = [0,1,2,3,4,8,9]
>>> filter(lambda i: i not in master_list, compare_list)
[7, 5]

答案 1 :(得分:0)

compare_list = [x for x in compare_list if x not in master_list]

如果master_list包含多个项目,则使用set

会更有效
master_set = set(master_list)
compare_list = [x for x in compare_list if x not in master_set]

答案 2 :(得分:0)

正如python官方文档 list.remove 所建议的那样 “从列表中删除值为x的第一个项目。如果没有这样的项目,则会出错。”

因此,如果您的 compare_list 中有重复项,则不会将其删除。

如果您已经有一个列表,并且需要从中删除重复项,我认为您需要在列表中转换列表:

compare_list = [1,2,2,3,4,5,5,5]
my_set = set(compare_list)

如果您需要过滤 compare_list 删除某些特定元素,则可以在使用set的方法删除将列表转换为集合后执行此步骤

答案 3 :(得分:0)

为什么不使用collections.Counter

import collections

compare_list = [0,1,1,2,3,3,4,7,5,8,9,9]
master_list = [0,1,2,3,4,8,9]

comp_set = collections.Counter(compare_list)
master_set = collections.Counter(master_list)

print comp_set-master_set

产:

Counter({1: 1, 3: 1, 9: 1, 5: 1, 7: 1})

请注意substract()可能导致0或负数。因此,要有效地使用您的结果,您可能需要添加额外的传递:

print [k for k,v in (comp_set-master_set).items() if v > 0]
#                                                 ^^^^^^^^ 

产:

[1, 3, 9, 5, 7]