4 回答

TA貢獻1853條經(jīng)驗 獲得超9個贊
重要說明:您必須先對數(shù)據(jù)進行排序。
我沒有得到的部分是在示例構(gòu)造中
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 groupbythings = [("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()
函數(shù)有兩個參數(shù):(1)要分組的數(shù)據(jù)和(2)將數(shù)據(jù)分組的函數(shù)。
在這里,lambda x: x[0]
告訴groupby()
使用每個元組中的第一項作為分組鍵。
在上面的for
語句中,groupby
返回三個(鍵,組迭代器)對-每個唯一鍵一次。您可以使用返回的迭代器來迭代該組中的每個單個項目。
這是一個使用列表推導的具有相同數(shù)據(jù)的稍有不同的示例:
for key, group in groupby(things, lambda x: x[0]): listOfThings = " and ".join([thing[1] for thing in group]) print(key + "s: " + listOfThings + ".")
這將為您提供輸出:
動物:熊和鴨。
植物:仙人掌。
車輛:快艇和校車。

TA貢獻1878條經(jīng)驗 獲得超4個贊
itertools.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
groupby
對象產(chǎn)生密鑰組對,其中組是生成器。
特征
A.將連續(xù)的項目組合在一起
B.歸因于可迭代項,將所有出現(xiàn)的項歸為一組
C.指定如何使用按鍵功能 對項目進行分組*
比較表
# Define a printer for comparing outputs>>> def print_groupby(iterable, keyfunc=None):... for k, g in it.groupby(iterable, keyfunc):... print("key: '{}'--> group: {}".format(k, list(g)))
# Feature A: group consecutive occurrences>>> print_groupby("BCAACACAADBBB")key: 'B'--> group: ['B']key: 'C'--> group: ['C']key: 'A'--> group: ['A', 'A']key: 'C'--> group: ['C']key: 'A'--> group: ['A']key: 'C'--> group: ['C']key: 'A'--> group: ['A', 'A']key: 'D'--> group: ['D']key: 'B'--> group: ['B', 'B', 'B']# Feature B: group all occurrences>>> print_groupby(sorted("BCAACACAADBBB"))key: 'A'--> group: ['A', 'A', 'A', 'A', 'A']key: 'B'--> group: ['B', 'B', 'B', 'B']key: 'C'--> group: ['C', 'C', 'C']key: 'D'--> group: ['D']# Feature C: group by a key function>>> # islower = lambda s: s.islower() # equivalent>>> def islower(s):... """Return True if a string is lowercase, else False.""" ... return s.islower()>>> print_groupby(sorted("bCAaCacAADBbB"), keyfunc=islower)key: 'False'--> group: ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D']key: 'True'--> group: ['a', 'a', 'b', 'b', 'c']

TA貢獻1824條經(jīng)驗 獲得超8個贊
Python文檔上的示例非常簡單:
groups = []uniquekeys = []for k, g in groupby(data, keyfunc): groups.append(list(g)) # Store group iterator as a list uniquekeys.append(k)
因此,在您的情況下,數(shù)據(jù)是節(jié)點的列表,keyfunc
條件函數(shù)的邏輯將在該列表中進行groupby()
分組,然后對數(shù)據(jù)進行分組。
在致電之前,您必須小心按照條件對數(shù)據(jù)進行排序,groupby
否則它將無法正常工作。groupby
方法實際上只是遍歷列表,并且只要更改鍵,它就會創(chuàng)建一個新組。

TA貢獻1982條經(jīng)驗 獲得超2個贊
使用groupby的一個妙招是在一行中運行長度編碼:
[(c,len(list(cgen))) for c,cgen in groupby(some_string)]
將為您提供2元組的列表,其中第一個元素是char,第二個是重復數(shù)。
編輯:請注意,這是itertools.groupby
與SQLGROUP BY
語義不同的東西:itertools不會(通常不能)事先對迭代器進行排序,因此不會合并具有相同“鍵”的組。
添加回答
舉報