Группировка последовательности по ключу функцией itertools.groupby()

Опубликован: 17.02.2024 95

В Python есть очень полезный и удобный инструмент группировки элементов итерируемой последовательности (функция itertools.groupby()), аналогичный GROUPBY в SQL.

Функция groupby() из модуляitertools используется для группировки последовательных элементов в итерируемом объекте на основе значения ключа, которое возвращается функцией-ключом. Это позволяет быстро и эффективно сгруппировать данные по определенному критерию.

Важно отметить, что groupby() эффективно работает только с уже отсортированными по ключу данными (иначе, одинаковые ключи, разделенные другими ключами, будут рассматриваться как разные группы). Поэтому перед использованием groupby()необходимо отсортировать данные с использованием той же ключевой функции.

Синтаксис: itertools.groupby(iterable, key=None)

  • iterable - итерируемая последовательность, элементы которой необходимо сгруппировать;
  • key - функция, вычисляющая значение ключа группировки для каждого элемента последовательности (по умолчанию None).

Функция itertools.groupby возвращает ключи и сгруппированные по ним итераторы. Если функция группировки key не задана, тогда данные будут сгруппированы по критерию тождественности их значений. По умолчанию для key используется функция lambda x: x, которая возвращает сам элемент.

from itertools import groupby

# Пример группировки списка кортежей
organisms = [('land', 'lion'), ('aquatic', 'shark'), ('air', 'eagle'), ('land','bear'), ('land', 'monkey'), ('aquatic', 'octopus')]

key_func = lambda x: x[0]    # функция группировки по первому элементу кортежа

for key, group in groupby(sorted(organisms, key=key_func), key_func):
    print(f"{key}: { [i[1] for i in group] }")

# Результат группировки
air: ['eagle']
aquatic: ['shark', 'octopus']
land: ['lion', 'bear', 'monkey']


# Использование groupby() для поиска дубликатов в списке
list_num = [2, 3, 5, 2, 6, 5, 3, 5, 2, 2]

for key, group in groupby(sorted(list_num)):
    print(f"{key} : {list(group)}")

2 : [2, 2, 2, 2]
3 : [3, 3]
5 : [5, 5, 5]
6 : [6]

Похожие посты

Фильтрация элементов итератора с помощью bool-списка функции itertools.compress()

Пропуск не нужных элементов последовательности с помощью itertools.dropwhile()

Возвращение элементов списка пока условие истинно с помощью itertools.takewhile()

Бесконечные итераторы в Python itertools.count(), cycle(), repeat()

Комментариев нет.