當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。