【问题标题】:Convert list of tuples to list?将元组列表转换为列表?
【发布时间】:2016-09-28 00:05:05
【问题描述】:

如何转换

[(1,), (2,), (3,)]

[1, 2, 3]

【问题讨论】:

标签: python


【解决方案1】:

使用简单的list comprehension:

e = [(1,), (2,), (3,)]
[i[0] for i in e]

会给你:

[1, 2, 3]

【讨论】:

    【解决方案2】:

    @Levon 的解决方案非常适合您的情况。

    附带说明,如果元组中有可变数量的元素,您也可以使用 itertools 中的 chain

    >>> a = [(1, ), (2, 3), (4, 5, 6)]
    >>> from itertools import chain
    >>> list(chain(a))
    [(1,), (2, 3), (4, 5, 6)]
    >>> list(chain(*a))
    [1, 2, 3, 4, 5, 6]
    >>> list(chain.from_iterable(a)) # More efficient version than unpacking
    [1, 2, 3, 4, 5, 6]
    

    【讨论】:

    • 还有chain.from_iterable()为你解包。
    • 这对我来说非常方便,谢谢。因为chain返回一个迭代器,你可以做max(chain.from_iterable(a))之类的事情。将它插入到另一个生成器表达式或列表推导中也很容易。
    【解决方案3】:

    如果您可以在元组中包含可变数量的元素,这是另一种选择:

    >>> a = [(1,), (2, 3), (4, 5, 6)]
    >>> [x for t in a for x in t]
    [1, 2, 3, 4, 5, 6]
    

    这基本上只是以下循环的缩写形式:

    result = []
    for t in a:
        for x in t:
            result.append(x)
    

    【讨论】:

    • 迄今为止的最佳答案,简洁/可概括。但是语法非常令人费解。最后一个for 语句是否类似于列表理解上的尾随if 语句,例如[i for i in range(10) if i%2==0]?我对后者很熟悉。
    【解决方案4】:
    >>> a = [(1,), (2,), (3,)]
    >>> zip(*a)[0]
    (1, 2, 3)
    

    对于列表:

    >>> list(zip(*a)[0])
    [1, 2, 3]
    

    【讨论】:

    • 我也更熟悉和熟悉它,但我正在尝试更多地了解 zip 和 itertools,所以这是有启发性的 :)
    【解决方案5】:

    你也可以使用sum函数如下:

    e = [(1,), (2,), (3,)] 
    e_list = list(sum(e, ()))
    

    它还可以与列表列表一起使用以将其转换为单个列表,但您需要按如下方式使用它:

    e = [[1, 2], [3, 4], [5, 6]]
    e_list = list(sum(e, []))
    

    这会给你[1, 2, 3, 4, 5, 6]

    【讨论】:

    • 您能否解释一下这是如何实现答案的?
    【解决方案6】:
    >>> a = [(1,), (2,), (3,)]
    >>> b = map(lambda x: x[0], a)
    >>> b
    [1, 2, 3]
    

    使用python3,你必须把list(..)函数放到map(..)的输出,即

    b = list(map(lambda x: x[0], a))
    

    这是一行使用python内置函数的最佳解决方案。

    【讨论】:

      【解决方案7】:

      总有一种方法可以通过 ...for...in... 从另一个列表中提取一个列表。在这种情况下,它将是:

      [i[0] for i in e]

      【讨论】:

        【解决方案8】:

        使用运算符或求和

        >>> from functools import reduce ### If python 3
        >>> import operator
        >>> a = [(1,), (2,), (3,)]
        >>> list(reduce(operator.concat, a))
        [1, 2, 3]
        

        (或)

        >>> list(sum(a,()))
        [1, 2, 3]
        >>> 
        

        如果在 python > 3 请从 functools 导入 reduce 喜欢from functools import reduce

        https://docs.python.org/3/library/functools.html#functools.reduce

        【讨论】:

        • NameError: name 'reduce' is not defined
        【解决方案9】:

        你也可以在列表推导中解包元组:

        e = [(1,), (2,), (3,)]
        [i for (i,) in e]
        

        仍会给予:

        [1, 2, 3]
        

        【讨论】:

          【解决方案10】:

          一个班轮哟!

          list(*zip(*[(1,), (2,), (3,)]))
          

          【讨论】:

            【解决方案11】:

            在这些情况下我喜欢这样做:

            a = [(1,), (2,), (3,)]
            new_a = [element for tup in a for element in tup]
            

            即使您的元组有多个元素,这也有效。这相当于这样做:

            a = [(1,), (2,), (3,)]
            new_a = []
            for tup in a:
                for element in tup:
                    new_a.append(element)
            

            【讨论】:

              猜你喜欢
              • 2012-06-05
              • 1970-01-01
              • 2018-12-19
              • 2015-02-13
              • 2018-07-20
              • 2022-09-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多