itertools.groupby
Создаёт итератор по сгруппированным элементам переданного объекта.
itertools.groupby(iterable, key=None)
-> iterator[tuple[Any, iterator]]
iiterable -- Объект, элементы которого требуется сгруппировать.
key=None -- Функция, вычисляющая и возвращающая ключ группировки для каждого элемента. Если не задана, используется функция идентичности (возвращает сам элемент).
key=None -- Функция, вычисляющая и возвращающая ключ группировки для каждого элемента. Если не задана, используется функция идентичности (возвращает сам элемент).
Внимание
В общем случае требуется предварительно отсортировать элементы, используя для сортировки ту же функцию, что была передана в
key
. См. sorted().Поведение функции похоже на фильтр
uniq
в Unix. Каждый раз, когда изменяется значение, возвращаемое функцией key
, создаётся новая группа. Поэтому целесообразно сортировать элементы, используя эту же функцию. Таким образом, поведение отличается от поведения GROUP BY
в SQL
, группирующей элементы вне зависимости от их порядка.Функция выдаёт кортежи из двух элементов.
Первый элемент: значение, возвращённое функцией
key
. Второй элемент: итератор по объектам, попавшим в группу.
from itertools import groupby
def grouper(item):
"""Будем использовать эту функцию для группировки сортировки."""
return item['country']
data = [
{'city': 'Москва', 'country': 'Россия'},
{'city': 'Новосибирск', 'country': 'Россия'},
{'city': 'Пекин', 'country': 'Китай'},
]
# Предварительно сортируем.
data = sorted(data, key=grouper)
for key, group_items in groupby(data, key=grouper):
print('Key: %s' % key)
for item in group_items:
print('Item: %s' % item)
'''
Key: Китай
Item: {'city': 'Пекин', 'country': 'Китай'}
Key: Россия
Item: {'city': 'Москва', 'country': 'Россия'}
Item: {'city': 'Новосибирск', 'country': 'Россия'}
'''
Синонимы поиска: itertools.groupby, itertools, groupby
В разделе «itertools»:
itertools.accumulate
itertools.chain
itertools.compress
itertools.count
itertools.cycle
itertools.dropwhile
itertools.filterfalse
itertools.ifilter
itertools.ifilterfalse
itertools.imap
itertools.islice
itertools.product
itertools.repeat
itertools.starmap
itertools.takewhile
itertools.tee
На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.