Создаёт итератор по сгруппированным элементам переданного объекта.
itertools.groupby(iterable, key=None)
-> iterator[tuple[Any, iterator]]
iiterable -- Объект, элементы которого требуется сгруппировать.

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
На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.