小编典典

如何使用 itertools.groupby()?

all

我一直无法找到关于如何实际使用 Pythonitertools.groupby()函数的可以理解的解释。我想要做的是:

  • 取一个列表——在这种情况下,一个对象化元素的子lxml元素
  • 根据某些标准将其分成几组
  • 然后稍后分别迭代这些组中的每一个。

我已经查看了文档,但是在尝试将它们应用到简单的数字列表之外时遇到了麻烦。

那么,我该如何使用itertools.groupby()?我应该使用另一种技术吗?指向良好的“先决条件”阅读的指针也将不胜感激。


阅读 105

收藏
2022-03-06

共1个答案

小编典典

重要提示: 您必须先 对数据进行排序


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

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 groupby

things = [("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 + ".")

这将为您提供输出:

动物:熊和鸭。
植物:仙人掌。
交通工具:快艇和校车。

2022-03-06