2014-01-28 74 views
2

假设我有一个包含两个元素的元组列表和一个(不是元组)列表的列表,例如整数如何将zip列表添加到已压缩列表中?

a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
b = [1, 2 ,3] 

我想让三元素的元组的列表,以便我编写象下面这样:

zipped = zip((t[0] for t in a), (t[1] for t in a), b) 
assert zipped == [('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 

我当前的代码工作得很好,但我想知道,有没有更多的高效和优雅的配方,但我的代码必须迭代和解压每个元组两次。 任何人都可以请指教?

回答

7

使用列表理解,元组拆包:

>>> a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
>>> b = [1, 2 ,3] 
>>> [(x,y,z) for (x,y), z in zip(a, b)] 
[('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 

>>> a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
>>> b = [1, 2 ,3] 
>>> [x + (y,) for x, y in zip(a, b)] 
[('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 
3

一个没有使用循环,

zip(*(zip(*a)+ [b])) 
+0

无需调用'tuple':'拉链(*(ZIP (* a)+ [b]))'也行。顺便说一句,这在Python 3.x中不起作用,因为[Python 3.x中的'zip](http://docs.python.org/3/library/functions.html#zip)返回一个迭代器而不是列表。 – falsetru

+0

是的,的确如此。编辑。谢谢。 –

+0

不使用3.x,但我想你可以使用list()将迭代器转换为列表。可能是zip(*(list(zip(* a))+ [b]))应该在那里工作。 –