是否有一个Python函数“外部zip”,它是 zip 的扩展,每个可迭代项都有不同的默认值?

a = [1, 2, 3]   # associate a default value 0
b = [4, 5, 6, 7] # associate b default value 1

zip(a,b)  # [(1, 4), (2, 5), (3, 6)]

outerzip((a, 0), (b, 1)) = [(1, 4), (2, 5), (3, 6), (0, 7)]
outerzip((b, 0), (a, 1)) = [(4, 1), (5, 2), (6, 3), (7, 1)]

我几乎可以使用map复制此externalzip函数,但将None作为唯一的默认设置:
map(None, a, b) # [(1, 4), (2, 5), (3, 6), (None, 7)]

注意1:内置的 zip 函数需要任意数量的可迭代对象,因此outerzip函数也应如此。 (例如,一个人应该能够像outerzip((a,0),(a,0),(b,1))zip(a,a,b)一样计算map(None, a, a, b)。)

注意2:我以this haskell question的方式说“outer-zip”,但这也许不是正确的术语。

最佳答案

您可以modify zip_longest 来支持常规可迭代项的用例。

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'), '$') )))

关于python - Outerzip/zip最长的功能(具有多个填充值),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13085861/

10-11 22:04