当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python itertools.groupby用法及代码示例


用法:

itertools.groupby(iterable, key=None)

创建一个从 iterable 返回连续键和组的迭代器。 key 是一个计算每个元素的键值的函数。如果未指定或为 None ,则 key 默认为恒等函数并返回未更改的元素。通常,iterable 需要已经在相同的 key 函数上排序。

groupby()的操作类似于Unix中的uniq过滤器。每次键函数的值发生变化时,它都会生成一个中断或新组(这就是为什么通常需要使用相同的键函数对数据进行排序的原因)。这种行为与 SQL 的 GROUP BY 不同,后者聚合公共元素,而不管它们的输入顺序如何。

返回的组本身就是一个迭代器,它与 groupby() 共享底层迭代。因为源是共享的,所以当groupby() 对象被推进时,前一个组不再可见。因此,如果以后需要该数据,则应将其存储为列表:

groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

groupby() 大致相当于:

class groupby:
    # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
    def __init__(self, iterable, key=None):
        if key is None:
            key = lambda x: x
        self.keyfunc = key
        self.it = iter(iterable)
        self.tgtkey = self.currkey = self.currvalue = object()
    def __iter__(self):
        return self
    def __next__(self):
        self.id = object()
        while self.currkey == self.tgtkey:
            self.currvalue = next(self.it)    # Exit on StopIteration
            self.currkey = self.keyfunc(self.currvalue)
        self.tgtkey = self.currkey
        return (self.currkey, self._grouper(self.tgtkey, self.id))
    def _grouper(self, tgtkey, id):
        while self.id is id and self.currkey == tgtkey:
            yield self.currvalue
            try:
                self.currvalue = next(self.it)
            except StopIteration:
                return
            self.currkey = self.keyfunc(self.currvalue)

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 itertools.groupby。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。