我一直无法找到如何真正使用Python的itertools.groupby()函数的可理解的解释。
我想要做的是:拿一个列表 - 在这种情况下,一个对象化的lxml元素的子元素根据一些条件将它们分成几组。
然后再分别遍历每个这些组。
我已经看过文档和示例,但是我试图将它们应用到一个简单的数字列表之外时遇到了麻烦。
那么,如何使用itertools.groupby()呢? 还有另一种技术我应该使用?
你首先必须对数据进行排序。这个很重要。
示例结构
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 " "
输出:
A bear is a animal.
A duck is a animal.
A cactus is a plant.
A speed boat is a vehicle.
A school bus is a vehicle.
在例子中,things
是一个元组列表,其中每个元组中的第一个元素是第二个元素所属的组。 groupby()
函数有两个参数:(1)要分组的数据;(2)分组函数。 这里,lambda x:x [0]
告诉groupby()
使用每个元组中的第一项作为grouping key。 在上面的语句中,groupby
返回三个(key,组迭代器)对 - 每个唯一键一次。 您可以使用返回的迭代器遍历该组中的每个单独的项目。
下面是另一个的例子:
for key, group in groupby(things, lambda x: x[0]):
listOfThings = " and ".join([thing[1] for thing in group])
print key + "s: " + listOfThings + "."
输出:
animals: bear and duck.
plants: cactus.
vehicles: speed boat and school bus.