我如何使用Python的itertools.groupby()?
我一直无法找到如何真正使用Python的itertools.groupby()
函数的可理解的解释。 我想要做的是这样的:
lxml
元素的孩子 我已经查阅了文档和示例,但是我试图将它们应用到一个简单的数字列表之外时遇到了麻烦。
那么,我该如何使用itertools.groupby()
? 我应该使用另一种技术吗? 指出良好的“先决条件”阅读也将不胜感激。
正如Sebastjan所说, 你首先必须对数据进行排序。 这个很重要。
我没有得到的部分是在示例结构中
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 + "."
这会给你输出:
动物:熊和鸭。
植物:仙人掌。
车辆:快艇和校车。
你能告诉我们你的代码吗?
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
方法实际上只是迭代一个列表,每当关键改变它创建一个新的组。
带groupby的neato技巧是在一行中运行长度编码:
[(c,len(list(cgen))) for c,cgen in groupby(some_string)]
会给你一个2元组列表,其中第一个元素是char,第二个元素是重复的数目。
编辑:请注意,这是将itertools.groupby
从SQL GROUP BY
语义中分离出来的结果:itertools不会(并且通常不能)事先对迭代器进行排序,因此具有相同“关键字”的组不会合并。