Python-如何使用itertools.groupby()?

发布于 2021-02-02 23:21:19

我还没有找到关于如何实际使用Python itertools.groupby()函数的可理解的解释。我想做的是这样的:

  • 列出一个列表-在这种情况下,是一个对象化lxml元素的子元素
  • 根据一些标准将其分为几组
  • 然后,稍后分别遍历每个组。

我已经阅读了文档和示例,但是尝试将其应用于简单的数字列表之外却遇到了麻烦。

那么,我该如何使用itertools.groupby()?我应该使用另一种技术吗?指向良好“前提”阅读的指针也将受到赞赏。

关注者
0
被浏览
115
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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

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

    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()使用每个元组中的第一项作为分组键。

    在上面的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 + "."
    

    这将为你提供输出:

    animals: bear and duck.
    plants: cactus.
    vehicles: speed boat and school bus.
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看