【问题标题】:How to yield every alternate element from generator?如何从生成器中产生每个备用元素?
【发布时间】:2021-02-01 16:49:52
【问题描述】:

如何从生成器中生成每个备用元素?

显而易见的方法似乎不起作用:

>>> generator[::2]
TypeError: 'generator' object is not subscriptable

当然,您可以编写实现相同目的的代码:

x = 0
for item in generator:
    if x % 2 == 0:
        do_something(item)
    x += 1

但是 Python 在像这样的紧密循环中不擅长数学,我很想知道如何才能做得更好。

【问题讨论】:

  • Python is bad at math in tight loops - 你能解释一下吗? could be done better. - 怎么样更好?
  • itertools.islice。例如,您可以使用islice(<your generator>, 0, None, 2)
  • 当您编写自己的生成器时,您可以完全控制产生哪些值,所以我看不出您在这里面临什么问题
  • 强烈推荐islice,但您也可以使用循环内生成器中的一个元素,如下所示:_ = next(generator)
  • @PranavHosangadi 您无需费心分配返回值。 while True: next(generator); yield next(generator).

标签: python


【解决方案1】:

这种方法可用于仅传递遵循任何重复索引模式的值:

def yield_every_other(g):
    from itertools import compress, cycle
    return compress(g, cycle([True, False]))

然后,例如,

>>> for x in yield_every_other(2*i for i in range(20)):
...     print(x)

展示

0
4
8
12
16
20
24
28
32
36

【讨论】:

    【解决方案2】:

    您可以使用enumerate 使第二个选项更简洁:

    for i, item in enumerate(generator):
        if i % 2 == 0:
            do_something(item)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 2011-09-09
      • 2018-12-12
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多