【问题标题】:generate tuple of values from iterables in Python 3在 Python 3 中从可迭代对象生成值元组
【发布时间】:2019-05-24 12:13:43
【问题描述】:

如果一个函数被传递了一个未定义数量的任意长度 M 的迭代器 N,有没有办法获得一个生成器,该生成器产生 M 个大小为 N 的元组,其中包含传递的迭代器的元素?

def dispatch(*iterables):
    args = ( some kind of generator that involves *iterables)
    for _ in args:
        yield _

换句话说,如果我们将 *iterables 视为 NxM 矩阵,其中每一列(函数参数)都是可迭代的,是否有办法使用生成器来生成矩阵的行?

例如:

a = [9,8,7,6]
b = 'ciao'
c = iter(range(0,4))

>>> res = dispatch(a,b,c)
>>> res.__next__()
(9,c,0)
>>> res.__next__()
(8,i,1)

etc...

此外,由于这个函数也可以只接受 1 个可迭代作为参数,生成器应该能够处理这种情况并输出 类似于:

a = [9,8,7,6]
>>> res = dispatch(a)
>>> res.__next__()
(9,)
>>> res.__next__()
(8,)

我尝试使用 zip,但它不能处理上述边缘情况,而且它有点慢,这表明它可能必须在产生输出之前读取整个内容。

【问题讨论】:

    标签: python python-3.x iterable-unpacking


    【解决方案1】:

    您可以将map 与打包参数的lambda 结合使用:

    >>> list(map(lambda *x: tuple(x), range(10), range(10), range(10)))
    [(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8), (9, 9, 9)]
    >>> list(map(lambda *x: tuple(x), range(10)))
    [(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,)]
    

    你的函数会很简单:

    def dispatch(*args):
        return map(lambda *x: tuple(x), *args)
    

    如您的示例:

    >>> a = [9,8,7,6]
    >>> b = 'ciao'
    >>> c = iter(range(0,4))
    >>> list(dispatch(a, b, c))
    [(9, 'c', 0), (8, 'i', 1), (7, 'a', 2), (6, 'o', 3)]
    

    【讨论】:

    • @darkpirate,它应该表现得非常好,在地图级别上表现相当出色。如果您希望它更好,请创建一个函数而不是 lambda
    【解决方案2】:

    使用zip()解包:

    def dispatch(*iterables):
        args = zip(*iterables)
        for _ in args:
            yield _
    

    产生:

    a = [9,8,7,6]
    b = 'ciao'
    c = iter(range(0,4))
    
    >>> res = dispatch(a,b,c)
    >>> res.__next__()
    (9, c, 0)
    >>> res.__next__()
    (8, i, 1)
    

    对于一个论点:

    a = [9,8,7,6]
    >>> res = dispatch(a)
    >>> res.__next__()
    (9,)
    >>> res.__next__()
    (8,)
    

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2017-12-18
      • 2020-03-31
      • 2018-04-30
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多