合并两个列表 Python

3

我有两个列表:

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

b = [7,8]

我希望将它合并到:
c = [(1,2,3,7),(4,5,6,8)]

我使用了 zip(a,b),但结果似乎不正确。有人可以帮忙吗?

你的变量 a 是一个元组列表。元组是一种不可变序列类型。 - Bryan
3
如果你不需要原地修改,那就无关紧要。 - millimoose
好的,我之前以为他们想要追加而不是替换。 - Bryan
7个回答

6

zip()函数将元组和整数一一配对。你还需要将元组和新项连接起来:

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

我认为这是最符合Python风格的解决方案(希望我这么说不只是因为这是我会做的方式)。没有聪明的技巧,也没有map/lambda的组合,它只是实现了它的功能。 - DSM

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

1
这很聪明,但我不觉得这很直观。需要再看一眼。尽管如此,我还是点了赞。 - st0le
我添加了一些注释以帮助理解。 - Joran Beasley
对我来说,这相当易读...虽然不如地图解决方案易读,但与其他一些解决方案相当,并且比某些解决方案更易读。 - Joran Beasley

3

尝试

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

1
比我的更好更简洁,你可能需要在代码中提供注释,以防以后忘记它是做什么的。 - Joran Beasley

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
这是我最喜欢的答案... 我不知道(从来没有真正想过)你可以将多个列表传递给map... 现在我知道了。 - Joran Beasley
@JoranBeasley,如果len(a) != len(b),这个方法是行不通的。map会用None填充多余的部分,然后就会出错。 - st0le
@st0le 感谢您指出这一点!但是,使用zip默默丢弃元素,抛出异常会更好吗? - tobias_k

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

1

这对我来说很清楚:

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

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