Python 3:在生成器内执行额外的计算

时间:2015-08-14 20:59:02

标签: python generator

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

问题1:在使用生成器之后可以在生成器表达式内执行一些额外的计算 - sum,count,更复杂的计算以避免在创建的列表上进行额外的循环?

问题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)

1 个答案:

答案 0 :(得分:2)

  

问题1:在使用生成器之后可以在生成器表达式内执行一些额外的计算 - sum,count,更复杂的计算以避免在创建的列表上进行额外的循环?

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

  

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

因此,如果您想访问生成器表达式中的上一个项目,只需在您的iterable上使用zip

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

但是如果你想访问生成器的前一项,你可以使用itertools.tee从你的生成器创建2个独立的迭代器,并使用zip函数创建一个新的生成器(在python 2中使用{ {1}})包含与prev和next项对的对。

itertools.izip

在迭代中执行:

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

zipped_generator = zip(new_generator,My_generator)