【问题标题】:Get difference from two lists in Python从 Python 中的两个列表中获取差异
【发布时间】:2011-03-14 22:06:17
【问题描述】:

我有两个列表,l1l2。我需要l1 中不在l2 中的项目。

l1 = [2, 3, 4, 5]
l2 = [0, 1, 2, 3]

我只想获得 [4,5] - l1 中的新值。

[i for i in l1 if not i in l2 ]

我可以在不迭代的情况下做到这一点吗?

【问题讨论】:

  • 听起来像是过早的优化。如果这基本上是一个迭代问题,你为什么说“不迭代”?

标签: python


【解决方案1】:

简短的回答,是的:list(set(l1) - set(l2)),尽管这不会保持秩序。

长答案,不,因为内部 CPU 将始终迭代。虽然如果您使用set(),那么迭代将被高度优化,并且会比您的列表理解更快(更不用说检查成员资格value in list比列表快得多)。

【讨论】:

  • 有人告诉我内联迭代也是高度优化的。它与存在时的表现不同:for i in l1: do()
  • 列表推导(不是内联迭代)确实比 for 循环更优化,但设置差异可能在高速 C 中完成,这会更好。而且因为您使用的是集合 in 关键字(或它的 C 表亲),所以速度非常快,因此速度更快。
【解决方案2】:

没有迭代就无法做到。即使您调用单个方法,内部也会进行迭代。

您的方法适用于较小的列表,但您可以使用此方法代替较大的列表:

s2 = set(l2)
result = [i for i in l1 if not i in s2 ]

这会很快,并且还会保留 l1 中元素的原始顺序。

【讨论】:

    【解决方案3】:

    当您的列表元素可以转换为集合时,转换为集合非常好。否则你需要Mark Byers' solution 之类的东西。如果您有要比较的大列表,您可能不想支付内存分配开销并将他的行简化为:

    [l1.remove(m) for m in l1 if m in l2]
    

    【讨论】:

    • 欢迎来到 SO。也许您应该重新考虑您的答案,因为 OP 似乎想要一个无迭代的解决方案。我猜他的意思是没有for循环,甚至不是列表理解。所以也许地图或过滤器解决方案会更合适。我也不认为他想改变原来的名单。
    【解决方案4】:

    你可以简单地这样做:

    list( set(l1) - set(l2) )
    

    这应该可以解决问题。

    【讨论】:

      【解决方案5】:

      如果你不关心元素的顺序,你可以使用集合:

      l1 = set([2, 3, 4, 5])
      l2 = set([0, 1, 2, 3])
      print l1 - l2
      

      打印

      set([4, 5])
      

      【讨论】:

      • 是的..我正在尝试做类似的事情。我没有为我而战。现在好啦。谢谢
      【解决方案6】:

      您可以使用 set_1.difference_update(set_2) 进行原地差异:

      >>sl1 = set([2, 3, 4, 5])
      >>sl2 = set([0, 1, 2, 3])
      >>sl1.difference_update(sl2)
      >>sl1
      set([4, 5])
      

      【讨论】:

        【解决方案7】:

        使用内置模块set

        >>> a = set([1,2,3,4,5])
        >>> b = set([1,3,5])
        >>> a.difference(b)
        set([2, 4])
        

        另一种方法

        >>> a = set([1,2,3,4,5])
        >>> b = [1,3,5]
        >>> a.difference(b)
        set([2, 4])
        

        【讨论】:

          【解决方案8】:

          将它们转换为集合并使用差分运算符:

          l1=[2,3,4,5]
          l2=[0,1,2,3]
          
          answer = set(l1) - set(l2)
          

          【讨论】:

            【解决方案9】:

            例子:

            >>a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
            >>b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
            

            我们也可以连接以获得完全的差异:

            >>list (set(a) -set(b)) +  list (set(b) -set(a))
            >>[89, 34, 21, 55, 4, 6, 7, 9, 10, 11, 12]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-28
              • 1970-01-01
              • 1970-01-01
              • 2022-06-28
              • 2018-09-02
              相关资源
              最近更新 更多