Python中列表列表的简洁快速的zip操作?

时间:2012-10-16 02:25:51

标签: python algorithm list list-manipulation

在Python中实现以下zip操作是否有更简洁,更省时的方法?我将列表列表组合在一起以制作新列表,如下所示:

>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[10, 11, 12], [13, 14, 15]]
>>> for x, y in zip(a, b):
...   print zip(*[x, y])
... 
[(1, 10), (2, 11), (3, 12)]
[(4, 13), (5, 14), (6, 15)]

感谢。

4 个答案:

答案 0 :(得分:6)

除了替换之外,我真的没有看到更好的方法:

print zip(*[x, y])

使用:

print zip(x,y)

如果您真的在使用2个元素列表,那么您可以这样做:

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

(当你放下1个拉链时,效率会略高一些,但我不相信它更像 clear ,这是你应该真正担心的事情。)


如果您真的使用紧凑代码,可以使用map

map(zip,a,b) #[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]]

这可能比其他版本更有效率,但我认为您在代码清晰度方面付出了微不足道的代价(尽管其他人可能不同意)。

答案 1 :(得分:3)

>>> [zip(i, j) for i, j in zip(a,b)]
[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]]

当然,这与你上面写的一样。

答案 2 :(得分:2)

除了@mgilson所说的,如果您要压缩的列表很大,您还可以考虑使用itertools.izip

由于izip仅在请求时计算元素并且仅返回迭代器,因此对于大型列表,内存使用量远小于zip

答案 3 :(得分:1)

这也很有效:

print zip(sum(a,[]),sum(b,[]))

打印:

[(1, 10), (2, 11), (3, 12), (4, 13), (5, 14), (6, 15)]

这可能是最好的表现,也很简洁:

from itertools import chain
print zip(chain(*a),chain(*b))

相同的输出