【问题标题】:How To Merge an Arbitrary Number of Tuples in Python?如何在 Python 中合并任意数量的元组?
【发布时间】:2012-03-13 03:49:34
【问题描述】:

我有一个元组列表:

l=[(1,2,3),(4,5,6)]

列表可以是任意长度,元组也可以。我想将其转换为元素的列表或元组,按照它们出现的顺序:

f=[1,2,3,4,5,6] # or (1,2,3,4,5,6)

如果我知道在开发时我会得到多少元组,我可以添加它们:

m = l[0] + l[1]  # (1,2,3,4,5,6)

但是由于直到运行时我才知道我将拥有多少个元组,所以我不能这样做。我觉得有一种方法可以使用map 来做到这一点,但我想不通。我可以遍历元组并将它们添加到累加器中,但这会创建许多永远不会使用的中间元组。我还可以遍历元组,然后遍历元组的元素,并将它们附加到列表中。这似乎非常低效。也许有一个更简单的方法,我完全掩饰了。有什么想法吗?

【问题讨论】:

    标签: python tuples iterable-unpacking


    【解决方案1】:

    Chain他们(只创建一个生成器而不是保留额外的内存):

    >>> from itertools import chain
    >>> l = [(1,2,3),(4,5,6)]
    >>> list(chain.from_iterable(l))
    [1, 2, 3, 4, 5, 6]
    

    【讨论】:

    • 我知道必须有一个itertools 的方式来做到这一点,但我一生都找不到它。接受。
    【解决方案2】:
    l = [(1, 2), (3, 4), (5, 6)]
    print sum(l, ()) # (1, 2, 3, 4, 5, 6)
    

    【讨论】:

    • 当我以这种方式滥用sum 时,我总是感觉很糟糕。但这并没有阻止它也出现在我的脑海中。
    • () 作为start 值代表什么,或者,这是如何工作的?!一个空元组?
    • 对于更长的列表,这将比 chain.from_iterable 慢得多;它是 O(n^2)。 [也就是说,当我知道列表大小很小且有界时,我经常自己做。]
    • @DSM:是的,链条更好。但是,另一种解决方案总是不错的。
    • +1 表示简洁,但我接受链式答案是最有效的方法。
    【解决方案3】:
    reduce(tuple.__add__, [(1,2,3),(4,5,6)])
    

    【讨论】:

      【解决方案4】:
      tuple(i for x in l for i in x) # (1, 2, 3, 4, 5, 6)
      

      【讨论】:

        【解决方案5】:

        对以下所有内容使用 pythonic 生成器样式:

        b=[(1,2,3),(4,5,6)]
        
        list = [ x for x in i for i in b ] #produces a list
        gen = ( x for x in i for i in b ) #produces a generator
        tup = tuple( x for x in i for i in b ) #produces a tuple
        
        print list
        >> [1, 2, 3, 4, 5, 6]
        

        【讨论】:

        【解决方案6】:
        >>> from itertools import chain
        >>> l = [(1,2,3),(4,5,6)]
        >>> list(chain(*l))
        [1, 2, 3, 4, 5, 6]
        

        【讨论】:

          【解决方案7】:

          您可以使用.extend() 函数将列表中的值组合在一起,如下所示:

          l = [(1,2,3), (4,5,6)]
          m = []
          for t in l:
              m.extend(t)
          

          或使用reduce的更短版本:

          l = [(1,2,3), (4,5,6)]
          m = reduce(lambda x,y: x+list(y), l, [])
          

          【讨论】:

          • 列表有.extend(iterable)。无需从t 创建新列表。
          • @MattAlcock 所有未绑定的列表对象都将被垃圾收集器清理,对吗?抱歉,如果我没有正确理解您的问题。
          • @AndiDog 谢谢,不知道 list.extend(iterable),从任何角度来看,带有 .extend 的变体都应该更好
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-18
          • 1970-01-01
          相关资源
          最近更新 更多