【问题标题】:reverse next() in Python generatorPython生成器中的反向next()
【发布时间】:2019-08-24 03:18:58
【问题描述】:

假设我们有以下代码:

gen = (x for x in range(11))

for el in gen:
    print("Printing current element: ", el) #1
    if el % 3 == 0:
        print("The next item is: ", next(gen)) #2

在这个例子中,我想在#1 行中打印来自生成器的所有数字,另外在#2 行中打印那些可被3 整除的数字。代码必须使用元素方式(而不是索引方式)迭代。还有一个限制是生成器gen 必须保持生成器(由于内存限制)并且不能使用,例如作为reversed(list(gen))中的列表。

由于next(gen),当前实现使迭代跳过数字。

【问题讨论】:

  • 你不需要"The next item is: ", el吗? (正如您所说,您需要在此行中打印可被 3 整除的内容)。

标签: python for-loop iterator next


【解决方案1】:

您可以使用itertools.tee 复制迭代器,通过调用next 将复制的迭代器替换偏移量1,然后使用itertools.zip_longest 将两个迭代器配对以进行迭代:

from itertools import tee, zip_longest
gen = (x for x in range(11))
a, b = tee(gen)
next(b)
for el, n in zip_longest(a, b):
    print("Printing current element: ", el)
    if el % 3 == 0:
        print("The next item is: ", n)

这个输出:

Printing current element:  0
The next item is:  1
Printing current element:  1
Printing current element:  2
Printing current element:  3
The next item is:  4
Printing current element:  4
Printing current element:  5
Printing current element:  6
The next item is:  7
Printing current element:  7
Printing current element:  8
Printing current element:  9
The next item is:  10
Printing current element:  10

【讨论】:

  • 是否可以打印出数字 10 的当前元素?
猜你喜欢
  • 2018-04-14
  • 2015-11-07
  • 2012-08-29
  • 1970-01-01
  • 2010-12-06
  • 2019-03-30
  • 2015-12-16
  • 2010-10-31
相关资源
最近更新 更多