将元组列表转换为列表?

69

How do I convert

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

to

[1, 2, 3]

可能是重复的问题,参考 python - get list of tuples first index? - Emipro Technologies Pvt. Ltd.
12个回答

97

使用简单的列表推导式:

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

会给你:

[1, 2, 3]

69

@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]

14
还有一个 chain.from_iterable() 方法可以为您完成解包操作。 - stranac
这对我非常方便,谢谢。因为 chain 返回一个迭代器,你可以做像 max(chain.from_iterable(a)) 这样的事情。将它插入到另一个生成器表达式或列表推导中也很容易。 - QuantumChris

35
如果你的元组中含有可变数量的元素,这里提供另一种替代方案:
>>> 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)

2
迄今为止最好的答案,简洁易懂/具有普适性。但是语法相当令人费解。那个最后的 for 语句是否类似于列表推导式上的尾随 if 语句,例如 [i for i in range(10) if i%2==0]?我熟悉后者。 - Luke Davis

7
>>> 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
>>> a = [(1,), (2,), (3,)]
>>> zip(*a)[0]
(1, 2, 3)

对于一个列表:

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

2
我更熟悉和舒适使用它,但我正在尝试学习更多关于zip和itertools的知识,所以这很有教育意义 :) - Levon

6
您也可以按照以下方式使用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]


请问您可以解释一下这是如何得出答案的吗? - Vaidøtas I.

4
使用操作符或 sum
>>> 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: 名称 'reduce' 未定义 - Walid Bousseta

4

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

[i[0] for i in e]


3

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

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

仍将给出:

[1, 2, 3]

2

一句话简介:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接