假设我有一个像这样的生成器函数:
import random
def big_gen():
i = 0
group = 'a'
while group != 'd':
i += 1
yield (group, i)
if random.random() < 0.20:
group = chr(ord(group) + 1)例如,输出可能是:(a,1),(a,2),(a,3),(a,4),(a,5),(a,6),(a,7),(a,8),(b,9),(c,10),(c,11),(c,12),(c,13)
我想把它分成三组: A组、B组和C组,我希望每组都有一个生成器。然后我会把生成器和组字母传递到一个子函数中。子函数的一个例子:
def printer(group_letter, generator):
print "These numbers are in group %s:" % group_letter
for num in generator:
print "\t%s" % num预期的产出将是:
These numbers are in group a:
1
2
3
4
5
6
7
8
These numbers are in group b:
9
These numbers are in group c:
10
11
12
13如何在不更改big_gen()或打印机()的情况下做到这一点,并避免将整个组同时存储在内存中?(在现实生活中,这些小组都是)
发布于 2009-08-01 01:39:01
当然,这能做你想做的事:
import itertools
import operator
def main():
for let, gen in itertools.groupby(big_gen(), key=operator.itemgetter(0)):
secgen = itertools.imap(operator.itemgetter(1), gen)
printer(let, secgen)groupby在这里做大部分工作-- key=只是告诉它要按哪个字段分组。
产生的生成器需要包装在一个imap中,仅仅因为您指定了您的printer签名来接受一个迭代器而不是数字,而从本质上讲,groupby返回的迭代器与它输入的条目相同--在这里,2项元组带有一个字母,后面跟着一个数字--但这与问题的标题并不完全相关。
这个标题的答案是,是的,Python函数可以很好地完成您想要的工作-- itertools.groupby实际上就是这样做的。我建议仔细研究迭代工具模块,它是一个非常有用的工具(并且提供了出色的性能)。
https://stackoverflow.com/questions/1215464
复制相似问题