Python:类似拉链的功能,填充到最长的长度?

时间:2009-08-14 11:04:09

标签: python list zip

是否有类似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)]

5 个答案:

答案 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+),也可以将mapNone一起使用。这是一个鲜为人知的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]