我如何使用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不会(并且通常不能)事先对迭代器进行排序,因此具有相同“关键字”的组不会合并。

    链接地址: http://www.djcxy.com/p/18015.html

    上一篇: How do I use Python's itertools.groupby()?

    下一篇: Removing coordinates from list on python