1

有没有更简洁和省时的方法来zip在 Python 中实现以下操作?我将列表列表配对以创建新列表,如下所示:

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

4 回答 4

6

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

print zip(*[x, y])

和:

print zip(x,y)

如果你真的在使用 2 个元素列表,你可能只是这样做:

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

(当你离开 1 个拉链时,它会稍微更有效率,但我不相信它会更清晰,这是你真正应该担心的)。


如果你真的很喜欢紧凑的代码,你可以使用map

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

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

于 2012-10-16T02:29:43.697 回答
3
>>> [zip(i, j) for i, j in zip(a,b)]
[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]]

当然,这实际上与您在上面写的内容相同。

于 2012-10-16T02:34:02.437 回答
2

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

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

于 2012-10-16T02:32:37.603 回答
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))

相同的输出

于 2012-10-16T03:44:09.077 回答