首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python函数可以接受生成器并将生成器返回到生成输出的子集吗?

Python函数可以接受生成器并将生成器返回到生成输出的子集吗?
EN

Stack Overflow用户
提问于 2009-08-01 00:24:45
回答 2查看 980关注 0票数 5

假设我有一个像这样的生成器函数:

代码语言:javascript
复制
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组,我希望每组都有一个生成器。然后我会把生成器和组字母传递到一个子函数中。子函数的一个例子:

代码语言:javascript
复制
def printer(group_letter, generator):
  print "These numbers are in group %s:" % group_letter
  for num in generator:
    print "\t%s" % num

预期的产出将是:

代码语言:javascript
复制
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()或打印机()的情况下做到这一点,并避免将整个组同时存储在内存中?(在现实生活中,这些小组都是)

EN

Stack Overflow用户

回答已采纳

发布于 2009-08-01 01:39:01

当然,这能做你想做的事:

代码语言:javascript
复制
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实际上就是这样做的。我建议仔细研究迭代工具模块,它是一个非常有用的工具(并且提供了出色的性能)。

票数 8
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1215464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档