Полезный и удобный инструмент python itertools groupby, к сожалению, имеет не очень ясное разъяснение в документации, при этом являясь мощным и удобным способом группировки.
itertools.groupby(iterable, key=None) принимает итератор и функцию группировки, а возвращает ключи и сгруппированные по ним итераторы. Если функция группировки не задана, тогда данные будут сгруппированы в том порядке, котором они идут. Зачастую, предварительно следует отсортировать передаваемый итератор.
Пример с дефолтной группировкой
1 2 3 4 5 6 7 8 |
import itertools for key, group in itertools.groupby('AABBCCA'): print(f'Key {key}:', ', '.join([i for i in group])) # Key A: A, A # Key B: B, B # Key C: C, C # Key A: A |
Если предварительно отсортировать входные данные, то результат будет другим
1 2 3 4 5 6 7 |
import itertools for key, group in itertools.groupby(sorted('AABBCCA')): print(f'Key {key}:', ', '.join([i for i in group])) # Key A: A, A, A # Key B: B, B # Key C: C, C |
Передача своей функции группировки добавляет удобство в использовании этого инструмента:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
items = [('animal', 'cat', 'black'), ('animal', 'elephant', 'grey'), ('plant', 'dandelion', 'yellow'), ('plant', 'cactus', 'green'), ('bird', 'parrot', 'yellow')] for key, group in itertools.groupby(items, lambda x: x[0]): print(f'{key}:') print(*[item for item in group], sep=', ') # animal: # ('animal', 'cat', 'black'), ('animal', 'elephant', 'grey') # plant: # ('plant', 'dandelion', 'yellow'), ('plant', 'cactus', 'green') # bird: # ('bird', 'parrot', 'yellow') |
Вариант без сортировки:
1 2 3 4 5 6 7 8 9 10 11 12 |
import itertools items = [('animal', 'cat', 'black'), ('animal', 'elephant', 'grey'), ('plant', 'dandelion', 'yellow'), ('plant', 'cactus', 'green'), ('bird', 'parrot', 'yellow')] for key, group in itertools.groupby(items, lambda x: x[2]): print(f'{key}:', ', '.join([item[1] for item in group])) # black: cat # grey: elephant # yellow: dandelion # green: cactus # yellow: parrot |
Вариант с сортировкиой:
1 2 3 4 5 6 7 8 9 10 11 |
import itertools items = [('animal', 'cat', 'black'), ('animal', 'elephant', 'grey'), ('plant', 'dandelion', 'yellow'), ('plant', 'cactus', 'green'), ('bird', 'parrot', 'yellow')] for key, group in itertools.groupby(sorted(items, key=lambda x: x[2]), lambda x: x[2]): print(f'{key}:', ', '.join([item[1] for item in group])) # black: cat # green: cactus # grey: elephant # yellow: dandelion, parrot |