【问题标题】:How to take two lists and combine them excluding any duplicates?如何获取两个列表并将它们组合起来,不包括任何重复项?
【发布时间】:2011-01-12 21:00:37
【问题描述】:

我想从两个不同的独特项目列表中创建一个列表。

还有其他类似的问题,但似乎没有人关心如何有效地解决这个问题,因为列表有几百万个项目。

完全不相关:我是唯一一个讨厌标签建议框如何掩盖“发布您的问题”按钮的人吗?

【问题讨论】:

  • 列表中项目的顺序重要吗?

标签: python


【解决方案1】:

使用set

>>> first = [1, 2, 3, 4]
>>> second = [3, 2, 5, 6, 7]
>>> third = list(set(first) | set(second))      # '|' is union
>>> third
[1, 2, 3, 4, 5, 6, 7]

【讨论】:

  • 不使用set怎么办?
  • 嘿 user225312,你通过两次调用 set() 并使用 union 有什么收获吗?本能地我会写 list(set(first + second))。
  • 请注意,如果列表包含不可散列的类型(例如字典列表),则不能使用此方法
  • 还请注意,third 中的结果列表将不会必然被排序/排序,因为设置散列其组件的方式。如果需要对结果进行排序,请使用sorted()
【解决方案2】:

一种更有效的方法:

>>> first = [1, 2, 3, 4]
>>> second = [3, 2, 5, 6, 7]

# New way
>>> list(set(first + second))
[1, 2, 3, 4, 5, 6, 7]
#1000000 loops, best of 3: 1.42 µs per loop

# Old way
>>> list(set(first) | set(second))
[1, 2, 3, 4, 5, 6, 7]
#1000000 loops, best of 3: 1.83 µs per loop

新方法效率更高,因为它只有一个 set() 而不是 2 个。

【讨论】:

    【解决方案3】:
    >>> l1 = range(10)
    >>> l2 = range(5, 15)
    >>> set(l1) | set(l2)
    set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
    

    【讨论】:

      【解决方案4】:

      如果有人想在没有set() 的情况下这样做:

      a = [1,2,3]
      b = [2,3,4]
      newlist=[]
      for i in a:
          newlist.append(i)
      for z in b:
          if z not in newlist:
              newlist.append(z)
      newlist.sort()
      print newlist
      

      【讨论】:

        【解决方案5】:

        清洁和专业的解决方案:

        list = [1, 2, 3]
        list1 = [3, 4, 5]
        result = list(set().union(list, list1)) # result [1, 2, 3, 4, 5]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-01
          • 1970-01-01
          • 2019-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-05
          • 2012-04-27
          相关资源
          最近更新 更多