2012-10-03 103 views
3

我有两个列表:合并两个列表蟒蛇

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

b = [7,8] 

我想将它合并到:

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

我用zip(a,b)但结果似乎并不正确。谁能帮忙?

+0

你的变量'了'是一个元组列表。 [tuple](http://docs.python.org/library/functions.html#tuple)是一个不可变的序列类型。 – Bryan

+3

@beargle如果你不需要改变就地完成,那并不重要。 – millimoose

+0

好的,我想他们想追加,而不是替换。 – Bryan

回答

5
>>> a = [(1,2,3),(4,5,6)] 
>>> b = [7,8] 
>>> c = zip(*a)+[b] #c looks like [(1,4),(2,5),(3,6),(7,8)] 
>>> print zip(*c) #zip it back together 
[(1, 2, 3, 7), (4, 5, 6, 8)] 
>>> 
+0

+1:可爱。难以捉摸,但可爱。 – millimoose

+1

这很聪明,但我不觉得这很直观。它再次看了一下。 Upvoted永远不会少。 – st0le

+0

我添加了一些意见,以帮助 –

3

尝试

map (lambda x: x[0]+(x[1],), zip(a,b)) 
+1

比我的更好,更短...可能要在代码中提供意见,但您可能会忘记以后的工作 –

6

zip()将刚配对的元组和整数。您还需要连接的元组和新的项目:

c = [aa + (bb,) 
    for aa, bb in zip(a, b)] 
+0

ISTM这是最为Pythonic的解决方案(我希望我不只是这么说,因为它就是这样我会做)。没有聪明和没有地图/ lambda组合,它只是做到了。 – DSM

1
print((a[0]+(b[0],),a[1]+(b[1],))) 
2

而另一个版本:

from itertools import izip 
[x+(y,) for x,y in izip(a,b)] 

应该是有效的,它表示你真的在做一个可读的方式是什么。

2

而另一个:

map(lambda t, e: t + (e,), a, b) 

无需压缩,解压缩; map可以同时占用两个列表。

+1

这是我最喜欢的答案...我不知道(没有真的考虑过它)你可以通过超过1列表映射...现在我做 –

+0

@JoranBeasley,这将不会工作,如果'len(a) != len(b)'。 'map'用'None'填充多余部分,它会炸毁。 – st0le

+0

@ st0le感谢您指出这一点!但是不会有例外情况比使用'zip'无声地丢弃元素更好吗? –

1

这似乎很清楚对我说:

[x + (b[i],) for i,x in enumerate(a)]