在Python中,如何将一系列元组列表合并为一个列表?

32
根据我之前的问题 如何将列表项分组为元组? 如果我有一个元组列表,例如:
a = [(1,3),(5,4)]

如何解包元组并将其重新格式化为单个列表?
b = [1,3,5,4]

我认为这也与`iter`函数有关,但我真的不知道该怎么做。请给我指点。

几乎完全重复... - danodonovan
我本希望可以使用一个“splat”运算符来完成这个任务,但不幸的是,在推导表达式中是不允许使用的 :( https://www.python.org/dev/peps/pep-0448/#id10 - robert
在编程中,使用“sum”就像这个非常好的答案中所示。 - kilodalton
5个回答

68
b = [i for sub in a for i in sub]

那就行了。


6
哦,是的,那很容易,我当时在想什么呢... - LWZ
1
不错。我得花一秒钟思考一下——“sub是从哪里来的?” - bjd2385
1
为什么/如何运作? - ruief
3
请解释一下那是如何工作的,我也对双重循环感到困惑。 - Asara
4
@ruief @Asara 双重循环的工作方式与嵌套的for循环完全相同:for sub in a 遍历 a 中的每个子列表(或元组),然后 for i in sub 遍历每个子列表中的每个元素,将它们组合在一起形成结果列表。希望这能让解释更加清晰明了。 - Volatility
1
不知道你可以在列表推导式中使用双重循环,很好。答案有效且简洁,所以我已经点赞了...但该语法真的很难阅读。 - otocan

14
In [11]: list(itertools.chain(*a))
Out[11]: [1, 3, 5, 4]

如果你只需要迭代 1, 3, 5, 4,你可以省略 list() 调用。

那么,如果你可以这样做,itertools.chain.from_iterable有什么意义呢? - Volatility
2
@Volatility:惰性求值? - NPE

3
只需在列表a上进行迭代并解包元组即可:
l = []
for x,y in a:
   l.append(x)
   l.append(y)

3
另一种方法:
a = [(1,3),(5,4)]
b = []

for i in a:
    for j in i:
        b.append(j)

print b

这只处理列表(a)中的元组。如果您想解析松散变量,例如:您需要添加if-else语句;
a = [(1,3),(5,4), 23, [21, 22], {'somevalue'}]
b = []

for i in a:
    if type(i) == (tuple) or type(i) == (list) or type(i) == (set):
        for j in i:
            b.append(j)
    else:
        b.append(i)

print b

请使用isinstance(i, collections.Iterable)代替类型检查(假设已经导入了collections)。 - Volatility

1
import itertools
b = [i for i in itertools.chain(*[(1,3),(5,4)])]

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