使用函式對可迭代物件中的項進行分組

從需要分組的迭代開始

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)]