是否有类似zip()
的内置函数,但会填充结果,以便结果列表的长度是最长输入的长度,而不是< em>最短输入?
>>> 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)]
答案 0 :(得分:184)
在Python 3中,您可以使用itertools.zip_longest
>>> list(itertools.zip_longest(a, b, c))
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]
您可以使用None
参数填充与fillvalue
不同的值:
>>> list(itertools.zip_longest(a, b, c, fillvalue='foo'))
[('a1', 'b1', 'c1'), ('foo', 'b2', 'c2'), ('foo', 'b3', 'foo')]
使用Python 2,您可以使用itertools.izip_longest
(Python 2.6+),也可以将map
与None
一起使用。这是一个鲜为人知的feature of map
(但{3.}}在Python 3.x中已更改,因此这仅适用于Python 2.x.)
map
答案 1 :(得分:79)
对于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)]
答案 2 :(得分:3)
非itertools Python 3解决方案:
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)
答案 3 :(得分:1)
non itertools我的Python 2解决方案:
if len(list1) < len(list2):
list1.extend([None] * (len(list2) - len(list1)))
else:
list2.extend([None] * (len(list1) - len(list2)))
答案 4 :(得分:0)
我使用2d数组,但是使用python 2.x的概念相似:
if len(set([len(p) for p in printer])) > 1:
printer = [column+['']*(max([len(p) for p in printer])-len(column)) for column in printer]