【问题标题】:Python function to merge unique values form multiple lists to one listPython函数将多个列表中的唯一值合并到一个列表中
【发布时间】:2013-03-26 00:30:57
【问题描述】:

我对 Python 还是很陌生。我正在尝试编写一个函数,它将单独列表中的唯一值合并到一个列表中。我不断得到列表元组的结果。最终,我想从我的三个列表-a,b,c 中获得一个唯一值列表。谁能帮我解决这个问题?

def merge(*lists):
    newlist = lists[:]
    for x in lists:
        if x not in newlist:
            newlist.extend(x)
    return newlist

a = [1,2,3,4]
b = [3,4,5,6]
c = [5,6,7,8]

print(merge(a,b,c))

我得到一个列表元组

([1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8])

【问题讨论】:

标签: python list function merge


【解决方案1】:

您可能只需要套装:

>>> a = [1,2,3,4]
>>> b = [3,4,5,6]
>>> c = [5,6,7,8]
>>>
>>> uniques = set( a + b + c )
>>> uniques
set([1, 2, 3, 4, 5, 6, 7, 8])
>>>

【讨论】:

    【解决方案2】:

    如果您不关心它们是否处于原始顺序,最简单且可能最快的方法是使用 set 函数:

    >>> set().union(a, b, c)
    {1, 2, 3, 4, 5, 6, 7, 8}
    

    如果您确实关心原始顺序(在这种情况下,集合碰巧会保留它,但不能保证),那么您可以通过意识到参数 @987654322 来修复您的原始尝试@ 包含您传入的所有原始列表的元组。这意味着迭代它会一次获得每个列表,而不是其中的元素 - 您可以使用 itertools 模块解决此问题:

    for x in itertools.chain.from_iterable(lists):
       if x not in newlist:
          newlist.append(x)
    

    此外,您可能希望 newlist 以空列表而不是输入列表的副本开始。

    【讨论】:

    • +1 用于使用联合而不是预先将列表添加在一起。这意味着您可以使用其他可迭代对象而不仅仅是列表。
    • 请注意,根据唯一值的数量,检查x not in newlist 的时间会随着每次迭代而增加。
    【解决方案3】:
    def merge(*lists):
        newlist = []
        for i in lists:
                newlist.extend(i)
        return newlist
    
    merge_list = merge(a,b,c,d)
    
    merge_list = set(merge_list)
    
    merge_list = list(merge_list)
    
    print(merge_list)
    

    【讨论】:

      【解决方案4】:

      处理动态生成的列表列表

      一个常见的用例是动态生成列表列表,每个子列表有时具有任意长度:

      import random
      abc, values = [], ["a", "b", "c", "d"]
      for i in range(3):
          l = []
          for j in range(3):
              l.append(values[random.randint(0, len(values) - 1)])
          abc.append(l)
      

      如果您使用的是列表列表,只需按照 g.d.d.c 的建议将它们相加即可。不起作用。那就是:

      uniques = set( a + b + c )
      

      问题在于您必须专门引用列表abc。 Ivc 的回答非常好,让我们更接近:

      set().union(a, b, c)
      

      但同样,您必须明确引用您的列表。

      解决方案

      要从任意长度的列表中获取唯一值,可以使用positional expansion

      import random
      abc, values = [], ["a", "b", "c", "d"]
      for i in range(3):
          l = []
          for j in range(3):
              l.append(values[random.randint(0, len(values) - 1)])
          abc.append(l)
      # The Important Line Below
      unique = set().union(*abc)
      print(unique)
      

      这将返回适当的无序值(例如["d", "b", "a", "d"]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-14
        • 2019-11-12
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-26
        相关资源
        最近更新 更多