Python 3:在生成器内部执行附加计算

Python 3: perform additional calculation inside a generator

问题是关于体育节目的。 我从 stdin 得到一个巨大的字符串,如果 char 等于 '.',我必须为每个具有 True 值的 char 创建一个字节数组。否则为 False 值。同时,当我们有两个“.”时,我应该计算案例数量。彼此靠近的符号。

问题 1:是否可以在使用生成器后访问生成器表达式内执行的一些额外计算 - 求和、计数、更复杂的计算以避免在创建的列表上进行额外循环?

问题 2:我可以在生成器表达式中访问之前的循环结果吗?我尝试在一个生成器表达式中执行下面的第二个解决方案。

因为这是为了比赛,所以不能使用外部库。

第一个解决方案

res = 0: prev = False
s = bytearray()
for c in (c == '.' for c in 'a' + input() + 'a'):
    res += c and prev
    prev = c
    s.append(c)

第二种解决方案

s = bytearray(c == '.' for c in 'a' + input() + 'a')
res = sum(map(all,zip(s[1:],s[:-1])))

UPD:使用 itertools.tee() 的第三个解决方案 - 不幸的是,这个解决方案比第一个快但比第二个慢

i1,i2,i3 = tee((c == '.' for c in 'a' + input() + 'a'),3)
next(i1)
res = sum(a and b for a,b in zip(i1,i2))
s = bytearray(i3)

Question 1: can be some additional calculation performed inside a generator expression to be accessible after the generator was used - sum, count, more complex calculation to avoid additional looping over the created list?

没有生成器是一次关闭的迭代器,一次迭代后就不能使用它们。

Question 2: can I access the previous loop result inside a generator expression? I try to perform the second solution below in one generator expression.

所以如果你想访问生成器表达式中的前一项,你可以简单地在你的可迭代对象上使用 zip :

inp='a' + input() + 'a'
(next=='.' and pre== '.' for pre,next in zip(inp,inp[1:]))  

但是如果你想访问生成器的前一个项目,你可以使用 itertools.tee 从你的生成器创建 2 个独立的迭代器并使用 zip 函数创建一个新的生成器(在 python 2 use itertools.izip)contain pairs with prev and next items.

from itertools import tee
new_generator,MY_generator=tee(MY_generator)
next(new_generator)

zipped_generator = zip(new_generator,My_generator)

并在迭代中做:

[for pre,next in zipped_generator]