在Python中对列表的列表进行简洁快速的zip操作?

在Python中对列表的列表进行简洁快速的zip操作?,python,algorithm,list,list-manipulation,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, 1

有没有一种更简洁、更省时的方法可以在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)]

谢谢。

我真的看不出除了替换以下内容之外还有什么更好的方法:

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

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

除了替换以下内容,我真的看不到更好的方法:

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

这可能比其他版本更有效,但是我认为你在代码清晰上付出了一点代价(虽然其他人可能不同意)。

除了@ Migelson所说的,你也可以考虑使用你正在拉链的列表。p>


<> > <>代码> Izip 只在请求时计算元素,只返回迭代器,对于大列表,内存使用远小于<代码> zip 。

除了@ Migelson所说的,如果你正在拉链列表,也可以考虑使用。p>
>>> [zip(i, j) for i, j in zip(a,b)]
[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]]
由于
izip
仅在请求时计算元素,并且仅返回迭代器,因此对于大型列表,内存使用量远小于
zip

>>> [zip(i, j) for i, j in zip(a,b)]
[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]]
当然,这和你上面写的是一样的

当然,这和你上面写的是一样的

这也很有效:

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))
相同的输出

这也很有效:

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

相同的输出

@KayZhu--是的,我不确定是否要提及它,因为您不经常看到多个参数
映射
。因为这不是一个特别熟悉的习语,我犹豫着使用它。。。但是我不认为你会找到一种用更少字符来完成的方法……是的,我同意我更喜欢没有
映射的现有代码。但很高兴知道还有另一种更简单的方法:)@KayZhu——我也一直认为
map(None,a,b)
基本上是一个
列表(izip_longest(a,b,fillvalue=None))
我知道这里有一个基于地图的简洁的oneliner,但是我没有想到将参数分别传递给
map
。我的想法是使用
starmap
list(itertools.starmap(zip,zip(a,b))
@KayZhu——是的,我不确定我是否想提及它,因为你不经常看到多个参数
map
。因为这不是一个特别熟悉的习语,我犹豫着使用它。。。但是我不认为你会找到一种用更少字符来完成的方法……是的,我同意我更喜欢没有
映射的现有代码。但很高兴知道还有另一种更简单的方法:)@KayZhu——我也一直认为
map(None,a,b)
基本上是一个
列表(izip_longest(a,b,fillvalue=None))
我知道这里有一个基于地图的简洁的oneliner,但是我没有想到将参数分别传递给
map
。我的想法是使用
starmap
list(itertools.starmap(zip,zip(a,b))