为了账号安全,请及时绑定邮箱和手机立即绑定

python中的itertools.groupby()

python中的itertools.groupby()

慕村225694 2021-03-30 13:09:51
我有元组。例如:set([(('E', ('T',)), 0), (('F', ('(', 'E', ')')), 0), (('T', ('F',)), 0), (('__S__', ('E', '$')), 0), (('E', ('E', '+', 'T')), 0), (('T', ('T', '*', 'F')), 0), (('F', ('id',)), 0)])如您所见,每个元组都有一个元组作为它的第一个元素(例如('F',('(','E',')')))。该元组的第一个元素是单个字符,第二个元素是另一个元组(例如('(','E',')')))。该元组中具有一个或多个单个字符。(实际上是上下文无关语法。第一个元素是rule(head)的LHS,第二个元组是RHS(body),每个元组的第二个元素中的数字是指向该语法RHS中字符之一的指针。我正在尝试我要做的就是根据所指向的元素对元组进行分组,为此,我编写了以下代码:import itertoolsS = set([(('E', ('T',)), 0), (('F', ('(', 'E', ')')), 0), (('T', ('F',)), 0), (('__S__', ('E', '$')), 0), (('E', ('E', '+', 'T')), 0), (('T', ('T', '*', 'F')), 0), (('F', ('id',)), 0)])for v, h in itertools.groupby(S, lambda x: x[0][1][x[1]] if len(x[0][1]) > x[1] else None ):     if (v is None):         continue     print '--'     print v     for hi in h:         print hi如果x [0] [1] [x [1]]相同,则两个元组在同一组中。x [0] [1]是第一个元组的第二个元组(语法的RHS),而x [1]是指针。我得到以下结果:--((('F', ('(', 'E', ')')), 0)--F(('T', ('F',)), 0)--E(('__S__', ('E', '$')), 0)--T(('T', ('T', '*', 'F')), 0)--id(('F', ('id',)), 0)--T(('E', ('T',)), 0)--E(('E', ('E', '+', 'T')), 0)如您所见,有两个键为“ T”的组。我不明白我在做什么错!我几乎是新的python程序员。万一问题太愚蠢了!
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

itertools.groupby()如果您希望按照文档将所有类似数据分组,则需要对数据进行排序:


通常,可迭代项需要已经在相同的键功能上进行了排序。


groupby()的操作类似于Unix中的uniq过滤器。每当键函数的值更改时,它就会生成一个中断或新组(这就是为什么通常需要使用相同的键函数对数据进行排序的原因)。这种行为与SQL的GROUP BY不同,后者的GROUP BY聚集公共元素,而不管它们的输入顺序如何。


只需先调用sorted()数据(将函数用作键函数),然后进行分组即可。


key_func = lambda x: x[0][1][x[1]] if len(x[0][1]) > x[1] else None

itertools.groupby(sorted(data, key=key_func), key_func)


查看完整回答
反对 回复 2021-04-02
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号