【问题标题】:Comparing two lists and filtering out duplicates比较两个列表并过滤掉重复项
【发布时间】:2014-08-20 17:26:38
【问题描述】:

也许这只是因为精神疲惫,但我一生都无法弄清楚这一点,即使我在我创建的另一个程序上使用了相同的原理..

我有两个列表:

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 中没有的数字?

【问题讨论】:

  • 在迭代 compare_list 时修改它不是一个好主意
  • 你考虑过使用 Python 的集合吗?
  • 您的描述与您的预期输出不符。看起来您可能想要两个列表的交集?
  • master_list 中是否允许重复?

标签: python list compare


【解决方案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]

【讨论】:

  • OP:“我想要完成的是比较两个列表,如果在 master_list 中找到它,则从 compare_list 中删除。”
  • 我就是这么做的。要“从 compare_list 中删除它”,您只需将 filter 的返回值分配回 compare_list
【解决方案2】:
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]

【讨论】:

    【解决方案3】:

    按照python官方文档的建议list.remove “从列表中删除第一个值为x的项目。如果没有这样的项目是错误的。”

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

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

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

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

    【讨论】:

      【解决方案4】:

      为什么不使用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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-15
        • 2018-05-01
        • 1970-01-01
        • 2011-04-05
        • 2020-01-18
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多