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

如何使用itertools.groupby()?

如何使用itertools.groupby()?

人到中年有点甜 2021-03-22 09:11:39
我还没有找到关于如何实际使用Pythonitertools.groupby()函数的可理解的解释。我想做的是这样的:列出一个列表-在这种情况下,是一个对象化lxml元素的子元素根据一些标准将其分为几组然后,稍后分别遍历这些组中的每一个。我已经阅读了文档,但是尝试将其应用于简单的数字列表之外时遇到了麻烦。那么,我该如何使用itertools.groupby()?我应该使用另一种技术吗?指向良好的“先决条件”阅读器的指针也将不胜感激。
查看完整描述

4 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

重要说明:您必须先对数据进行排序


我没有得到的部分是在示例构造中

groups = []uniquekeys = []for k, g in groupby(data, keyfunc):
   groups.append(list(g))    # Store group iterator as a list
   uniquekeys.append(k)

k是当前的分组密钥,并且g是一个迭代器,您可以使用该迭代器在该分组密钥定义的组上进行迭代。换句话说,groupby迭代器本身返回迭代器。

这是一个使用更清晰的变量名的示例:

from itertools import groupbythings = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]for key, group in groupby(things, lambda x: x[0]):    for thing in group:
        print("A %s is a %s." % (thing[1], key))
    print("")

这将为您提供输出:

熊是动物。
鸭子是动物。

仙人掌是植物。

快艇是车辆。
校车是车辆。

在此示例中,things是一个元组列表,其中每个元组中的第一项是第二项所属的组。

groupby()函数有两个参数:(1)要分组的数据和(2)将数据分组的函数。

在这里,lambda x: x[0]告诉groupby()使用每个元组中的第一项作为分组键。

在上面的for语句中,groupby返回三个(键,组迭代器)对-每个唯一键一次。您可以使用返回的迭代器来迭代该组中的每个单个项目。

这是一个使用列表推导的具有相同数据的稍有不同的示例:

for key, group in groupby(things, lambda x: x[0]):
    listOfThings = " and ".join([thing[1] for thing in group])
    print(key + "s:  " + listOfThings + ".")

这将为您提供输出:

动物:熊和鸭。
植物:仙人掌。
车辆:快艇和校车。


查看完整回答
反对 回复 2021-03-22
?
UYOU

TA贡献1878条经验 获得超4个赞

itertools.groupby 是用于分组项目的工具。

文档中,我们进一步了解了它可能会做什么:

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B

# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

groupby 对象产生密钥组对,其中组是生成器。

特征

  • A.将连续的项目组合在一起

  • B.归因于可迭代项,将所有出现的项归为一组

  • C.指定如何使用按键功能 对项目进行分组*

比较表

# Define a printer for comparing outputs>>> def print_groupby(iterable, keyfunc=None):...    for k, g in it.groupby(iterable, keyfunc):...        print("key: '{}'--> group: {}".format(k, list(g)))
# Feature A: group consecutive occurrences>>> print_groupby("BCAACACAADBBB")key: 'B'--> group: ['B']key: 'C'--> group: ['C']key: 'A'--> group: ['A', 'A']key: 'C'--> group: ['C']key: 'A'--> group: ['A']key: 'C'--> group: ['C']key: 'A'--> group: ['A', 'A']key: 'D'--> group: ['D']key: 'B'--> group: ['B', 'B', 'B']# Feature B: group all occurrences>>> print_groupby(sorted("BCAACACAADBBB"))key: 'A'--> group: ['A', 'A', 'A', 'A', 'A']key: 'B'--> group: ['B', 'B', 'B', 'B']key: 'C'--> group: ['C', 'C', 'C']key: 'D'--> group: ['D']# Feature C: group by a key function>>> # islower = lambda s: s.islower()                      # equivalent>>> def islower(s):...     """Return True if a string is lowercase, else False."""   ...     return s.islower()>>> print_groupby(sorted("bCAaCacAADBbB"), keyfunc=islower)key: 'False'--> group: ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D']key: 'True'--> group: ['a', 'a', 'b', 'b', 'c']


查看完整回答
反对 回复 2021-03-22
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

Python文档上的示例非常简单:

groups = []uniquekeys = []for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

因此,在您的情况下,数据是节点的列表,keyfunc条件函数的逻辑将在该列表中进行groupby()分组,然后对数据进行分组。

在致电之前,您必须小心按照条件对数据进行排序,groupby否则它将无法正常工作。groupby方法实际上只是遍历列表,并且只要更改键,它就会创建一个新组。


查看完整回答
反对 回复 2021-03-22
?
临摹微笑

TA贡献1982条经验 获得超2个赞

使用groupby的一个妙招是在一行中运行长度编码:

[(c,len(list(cgen))) for c,cgen in groupby(some_string)]

将为您提供2元组的列表,其中第一个元素是char,第二个是重复数。

编辑:请注意,这是itertools.groupby与SQLGROUP BY语义不同的东西:itertools不会(通常不能)事先对迭代器进行排序,因此不会合并具有相同“键”的组。


查看完整回答
反对 回复 2021-03-22
  • 4 回答
  • 0 关注
  • 273 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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