Is there a middle ground between `zip` and `zip_longest`

前端 未结 5 1041
面向向阳花
面向向阳花 2021-01-12 11:54

Say I have these three lists:

a = [1, 2, 3, 4]
b = [5, 6, 7, 8, 9]
c = [10, 11, 12]

Is there a builtin function such that:

         


        
5条回答
  •  独厮守ぢ
    2021-01-12 12:37

    This is longer than the others, but relatively easy to understand, if that matters. ;-)

    a = [1, 2, 3, 4]
    b = [5, 6, 7, 8, 9]
    c = [10, 11, 12]
    def g(n): return xrange(n)  # simple generator
    
    def my_iter(iterable, fillvalue=None):
        for i in iterable: yield i
        while True: yield fillvalue
    
    def somezip(*iterables, **kwds):
        fillvalue = kwds.get('fillvalue')
        iters = [my_iter(i, fillvalue) for i in iterables]
        return [tuple(next(it) for it in iters) for i in iterables[0]]
    
    print 'somezip(a, b):', somezip(a, b)
    print 'somezip(a, c):', somezip(a, c)
    print 'somezip(a, g(2)):', somezip(a, g(2))
    print 'somezip(g(2), a):', somezip(g(2),a)
    print 'somezip(a, b, c):', somezip(a, b, c)
    print 'somezip(a, b, c, g(2)):', somezip(a, b, c, g(2))
    print 'somezip(g(2), a, b, c):', somezip(g(2), a, b, c)
    

    Output:

    somezip(a, b): [(1, 5), (2, 6), (3, 7), (4, 8)]
    somezip(a, c): [(1, 10), (2, 11), (3, 12), (4, None)]
    somezip(a, g(2)): [(1, 0), (2, 1), (3, None), (4, None)]
    somezip(g(2), a): [(1, 1)]
    somezip(a, b, c): [(1, 5, 10), (2, 6, 11), (3, 7, 12), (4, 8, None)]
    somezip(a, b, c, g(2)): [(1, 5, 10, 0), (2, 6, 11, 1), (3, 7, 12, None), (4, 8, None, None)]
    somezip(g(2), a, b, c): [(1, 1, 5, 10)]
    

提交回复
热议问题