Python:压缩到最长的zip-like函数?
是否有一个像zip()
一样工作的内置函数,但会填充结果,以便结果列表的长度是最长input的长度而不是最短input的长度 ?
>>> a=['a1'] >>> b=['b1','b2','b3'] >>> c=['c1','c2'] >>> zip(a,b,c) [('a1', 'b1', 'c1')] >>> What command goes here? [('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]
你可以使用itertools.izip_longest
(Python 2.6+),也可以使用None
。 这是map
一个鲜为人知的特性 (但在Python 3.x中更改了map
,所以这只适用于Python 2.x)。
>>> map(None, a, b, c) [('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]
对于Python 2.6x,使用itertools
模块的izip_longest
。
对于Python 3,请使用zip_longest
(而不是前导i
)。
>>> list(itertools.izip_longest(a, b, c)) [('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]
非itertools Python 3解决scheme:
def zip_longest(*lists): def g(l): for item in l: yield item while True: yield None gens = [g(l) for l in lists] for _ in range(max(map(len, lists))): yield tuple(next(g) for g in gens)