Python: Генераторы списков, множеств и словарей

Генераторы коллекций в Python — обобщенное название для генераторов списков, множеств и словарей. В сообществе программистов их также называют списковыми, множественными и словарными включениями. Рассмотрим их на примере генераторов списков.

Генераторы списков

Генератор списков — компактный способ создания списка из существующего объекта. Синтаксис использует квадратные скобки [], внутри которых указывается:

  1. Финальное выражение: Элемент, которым заполняется новый список.
  2. Цикл for: Перебирает элементы исходной коллекции (любого итерируемого объекта: диапазон чисел, файл, строка, другой список и т.д.).
  3. Условие if (необязательно): Фильтрует элементы, добавляемые в новый список.

Пример создания списка четных чисел от 0 до 9:

[x for x in range(10) if x % 2 == 0]

Задача: список чисел, кратных 5

Создадим список чисел от 1 до 20, кратных 5. Без генератора списка:

numbers = []
for i in range(1, 21):
  if i % 5 == 0:
    numbers.append(i)
print(numbers)

С генератором списка:

numbers = [a for a in range(1, 21) if a % 5 == 0]
print(numbers)

Обратите внимание на компактность. Однако, не стоит злоупотреблять генераторами в ущерб читаемости.

Преимущества

  • Компактность: Создание списков в одной строке.
  • Производительность: Как правило, на 10% быстрее, чем создание списков с помощью цикла for.

Сумма кубов чисел, кратных 5

Найдем сумму кубов чисел от 1 до 20, кратных 5:

sum([a**3 for a in range(1, 21) if a % 5 == 0])

Код вычисляет сумму в одной строке, без создания промежуточного списка.

Вложенные циклы

Генераторы списков поддерживают вложенные циклы. Пример создания списка кортежей:

list_of_tuples = [(i, j) for i in range(1, 21) for j in range(1, 51)]
print(list_of_tuples)

Условные выражения if-else

В генераторах списков можно использовать условные выражения if-else:

numbers = [i**2 if i > 0 else i**3 for i in range(-10, 11) if i % 2 == 0]
print(numbers)

Здесь перебираются четные числа из диапазона от -10 до 10. Для каждого вычисляется квадрат (если число положительное) или куб (если отрицательное).

Порядок выполнения:

  1. Проход по коллекции.
  2. Проверка условия if i % 2 == 0 (фильтрация).
  3. Выполнение условного выражения if-else.

Можно комбинировать if-else и дополнительный фильтр. Для сложных генераторов используйте переносы строк для повышения читаемости.

Генераторы множеств и словарей

Генераторы множеств и словарей работают аналогично генераторам списков, но используют фигурные скобки {}. Множества не хранят дубликаты элементов. Словари содержат пары ключ-значение, где ключи должны быть уникальными.

Пример генератора множества:

my_set = {i for i in [10, -20, 10, -20]}
print(my_set)

Пример генератора словаря:

my_dict = {i: i**10 for i in [10, -20, 10, -20]}
print(my_dict)

Генераторы списков, множеств и словарей — мощный инструмент Python, позволяющий создавать коллекции данных компактно и эффективно. При выборе между генераторами и циклами for приоритет отдавайте читаемости кода. Производительность генераторов, как правило, выше, но незначительно.

Что будем искать? Например,программа