【问题标题】:Duplicate each member in an iterator复制迭代器中的每个成员
【发布时间】:2016-06-30 09:11:48
【问题描述】:

给定一个迭代器 i,我想要一个迭代器,它产生每个元素 n 次,即,相当于这个函数

def duplicate(i, n):
    for x in i:
        for k in range(n):
            yield x

这个有单行吗?

相关问题:duplicate each member in a list - python,但zip 解决方案在这里不起作用。

【问题讨论】:

    标签: python iterator


    【解决方案1】:

    如果您想同时复制每个元素,这是我的简单解决方案。它返回一个生成器表达式,它应该是内存高效的。

    def duplicate(i, n):
        return (k for k in i for j in range(n))
    

    一个例子可以是,

    print (list(duplicate(range(1, 10), 3)))
    

    哪些打印,

    [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]

    【讨论】:

    • "which is memory 高效",实际上 more 内存效率高于生成器函数,因为表达式不需要相同类型的 python 命名空间。
    • 什么是生成器函数?
    • 函数与yield 语句类似在 OP
    • 哦,我可能错了:stackoverflow.com/questions/1995418/…
    【解决方案2】:
    itertools.chain.from_iterable(itertools.izip(*itertools.tee(source, n)))
    

    例子:

    >>> x = (a**2 for a in xrange(5))
    >>> list(itertools.chain.from_iterable(itertools.izip(*itertools.tee(x, 3))))
    [0, 0, 0, 1, 1, 1, 4, 4, 4, 9, 9, 9, 16, 16, 16]
    

    另一种方式:

    itertools.chain.from_iterable(itertools.repeat(item, n) for item in source)
    
    >>> x = (a**2 for a in xrange(5))
    >>> list(itertools.chain.from_iterable(itertools.repeat(item, 3) for item in x))
    [0, 0, 0, 1, 1, 1, 4, 4, 4, 9, 9, 9, 16, 16, 16]
    

    【讨论】:

    • 不要为itertools.chain() 加注星标。请改用itertools.chain.from_iterable()
    • 这是一回事吗?我的意思是,根据所讨论的函数,他多次调用 call duplicate 函数,每个元素使用不同的数字。
    • 感谢tee 食谱!文档说“这个 (tee) itertool 可能需要大量的辅助存储”,但在这个实际用例中似乎还可以?你能解释一下吗?
    • @TonyBetaLambda:如文档中所述,tee 将使用大量存储空间,如果您使用其中一个重复项而不使用其他重复项。在此示例中,这不是问题,因为所有重复项都是同步推进的(即,您先从所有重复项中获取第一个元素,然后再从其中任何一个中获取第二个元素)。
    【解决方案3】:

    使用生成器表达式:

    >>> x = (n for n in range(4))
    >>> i = (v for v in x for _ in range(3))
    >>> list(i)
    [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
    

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 2011-01-27
      • 2017-04-04
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2011-03-24
      • 2019-02-27
      • 1970-01-01
      相关资源
      最近更新 更多