使用函式對可迭代物件中的項進行分組
從需要分組的迭代開始
lst = [("a", 5, 6), ("b", 2, 4), ("a", 2, 5), ("c", 2, 6)]
生成分組生成器,按每個元組中的第二個元素分組:
def testGroupBy(lst):
groups = itertools.groupby(lst, key=lambda x: x[1])
for key, group in groups:
print(key, list(group))
testGroupBy(lst)
# 5 [('a', 5, 6)]
# 2 [('b', 2, 4), ('a', 2, 5), ('c', 2, 6)]
僅對連續元素組進行分組。在呼叫 groupby 之前,你可能需要使用相同的鍵進行排序。例如,(最後一個元素已更改)
lst = [("a", 5, 6), ("b", 2, 4), ("a", 2, 5), ("c", 5, 6)]
testGroupBy(lst)
# 5 [('a', 5, 6)]
# 2 [('b', 2, 4), ('a', 2, 5)]
# 5 [('c', 5, 6)]
groupby 返回的組是一個迭代器,在下一次迭代之前將無效。例如,如果你希望按鍵對組進行排序,則以下內容將不起作用。組 5 在下面是空的,因為當獲取組 2 時,它使 5 無效
lst = [("a", 5, 6), ("b", 2, 4), ("a", 2, 5), ("c", 2, 6)]
groups = itertools.groupby(lst, key=lambda x: x[1])
for key, group in sorted(groups):
print(key, list(group))
# 2 [('c', 2, 6)]
# 5 []
要正確地進行排序,請在排序之前從迭代器建立一個列表
groups = itertools.groupby(lst, key=lambda x: x[1])
for key, group in sorted((key, list(group)) for key, group in groups):
print(key, list(group))
# 2 [('b', 2, 4), ('a', 2, 5), ('c', 2, 6)]
# 5 [('a', 5, 6)]