python itertools.groupby函数_itertools.groupby() ,python文档源码问题

groupby 本身是一个迭代器,每次迭代出的元组第二个元素是生成器,所以它有个设计约束,必须要顺序迭代展开每个生成器,像下面这样。

In [1]: from operator import itemgetter

In [2]: from itertools import groupby

In [3]: d1={'name':'zhangsan','age':20,'country':'China'}

...: d2={'name':'wangwu','age':19,'country':'USA'}

...: d3={'name':'lisi','age':22,'country':'JP'}

...: d4={'name':'zhaoliu','age':22,'country':'USA'}

...: d5={'name':'pengqi','age':22,'country':'USA'}

...: d6={'name':'lijiu','age':22,'country':'China'}

...: lst = [d1, d2, d3, d4, d5, d6]

In [4]: lstg = groupby(lst, key=itemgetter('country'))

...: for k, gs in lstg:

...: print(k)

...: for g in gs:

...: print(g)

...:

...:

China

{'name': 'zhangsan', 'age': 20, 'country': 'China'}

USA

{'name': 'wangwu', 'age': 19, 'country': 'USA'}

JP

{'name': 'lisi', 'age': 22, 'country': 'JP'}

USA

{'name': 'zhaoliu', 'age': 22, 'country': 'USA'}

{'name': 'pengqi', 'age': 22, 'country': 'USA'}

China

{'name': 'lijiu', 'age': 22, 'country': 'China'}

再看不按顺序迭代的情况

In [7]: lstg = groupby(lst, key=itemgetter('country'))

...: k1, gs1 = next(lstg)

...: k2, gs2 = next(lstg)

...: list(gs2)

...:

...:

...:

...:

Out[7]: [{'name': 'wangwu', 'age': 19, 'country': 'USA'}]

In [8]: list(gs1)

Out[8]: []

In [9]:

先迭代gs2后,gs1已经失效了,这是设计约束,这个约束是通过 _grouper的第一行达到的:

while self.id is id and self.currkey == tgtkey:

仅靠 self.currkey == tgtkey 不足以约束,如我给出的数据为例,lst 没有按 'country' 排序, 所以在迭代groupby 的对象时, 'China', 'USA' 这样的key都会两次出现。所以self.id是必须的标记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值