Outerzip / zip longest function (with multiple fill values)

前端 未结 3 1931
有刺的猬
有刺的猬 2021-01-11 17:19

Is there a Python function an \"outer-zip\", which is a extension of zip with different default values for each iterable?

a = [1, 2, 3]   # associate a defa         


        
相关标签:
3条回答
  • 2021-01-11 17:43

    It's called izip_longest (zip_longest in python-3.x):

    >>> from itertools import zip_longest
    >>> a = [1,2,3]
    >>> b = [4,5,6,7]
    >>> list(zip_longest(a, b, fillvalue=0))
    [(1, 4), (2, 5), (3, 6), (0, 7)]
    
    0 讨论(0)
  • 2021-01-11 17:50

    You could modify zip_longest to support your use case for general iterables.

    from itertools import chain, repeat
    
    class OuterZipStopIteration(Exception):
        pass
    
    def outer_zip(*args):
        count = len(args) - 1
    
        def sentinel(default):
            nonlocal count
            if not count:
                raise OuterZipStopIteration
            count -= 1
            yield default
    
        iters = [chain(p, sentinel(default), repeat(default)) for p, default in args]
        try:
            while iters:
                yield tuple(map(next, iters))
        except OuterZipStopIteration:
            pass
    
    
    print(list(outer_zip( ("abcd", '!'), 
                          ("ef", '@'), 
                          (map(int, '345'), '$') )))
    
    0 讨论(0)
  • 2021-01-11 17:59

    This function can be defined by extending each inputted list and zipping:

    def outerzip(*args):
        # args = (a, default_a), (b, default_b), ...
        max_length = max( map( lambda s: len(s[0]), args))
        extended_args = [ s[0] + [s[1]]*(max_length-len(s[0])) for s in args ]
        return zip(*extended_args)
    
    outerzip((a, 0), (b, 1)) # [(1, 4), (2, 5), (3, 6), (0, 7)]
    
    0 讨论(0)
提交回复
热议问题