Генераторы словарей (dict comprehensions)

Генераторы словарей (dict comprehensions) Генераторы списков и словарей

Привет! Ты уже знаешь, что генераторы списков позволяют создавать списки в одну строку. Аналогично, в Python есть генераторы словарей — они делают то же самое, но для словарей. Это удобно, когда нужно быстро создать словарь из существующих данных.

В этой статье мы разберём:

  • Что такое генератор словаря
  • Синтаксис и базовые примеры
  • Условия в генераторах словарей
  • Вложенные генераторы

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание словарей и генераторов списков

Совет: Генератор словаря — это способ создать словарь из итерируемого объекта в одну строку.

Основная часть

Что такое генератор словаря

Генератор словаря — это способ создания словарей в одну строку с использованием выражения и цикла for.

Синтаксис:

{ключ: значение for переменная in итерируемый_объект}

Пример:

# Создаём словарь квадратов чисел от 0 до 4
squares = {x: x ** 2 for x in range(5)}
print(squares)   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Совет: Это эквивалентно следующему коду, но короче:

squares = {}
for x in range(5):
    squares[x] = x ** 2
print(squares)   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Базовые примеры

Словарь из списка строк (ключ — слово, значение — длина):

words = ["apple", "banana", "cherry"]
lengths = {word: len(word) for word in words}
print(lengths)   # {'apple': 5, 'banana': 6, 'cherry': 6}

Словарь из двух списков (zip):

keys = ["name", "age", "city"]
values = ["Анна", 25, "Москва"]
user = {k: v for k, v in zip(keys, values)}
print(user)   # {'name': 'Анна', 'age': 25, 'city': 'Москва'}

Генераторы с условиями

if в конце — фильтрация:

# Только чётные числа (квадраты)
even_squares = {x: x ** 2 for x in range(10) if x % 2 == 0}
print(even_squares)   # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

if в выражении — преобразование:

# Чётные → квадрат, нечётные → 0
result = {x: x ** 2 if x % 2 == 0 else 0 for x in range(10)}
print(result)   # {0: 0, 1: 0, 2: 4, 3: 0, 4: 16, 5: 0, 6: 36, 7: 0, 8: 64, 9: 0}

 Совет: Аналогично генераторам списков, if в конце фильтрует, а if-else в выражении преобразует.

Преобразование существующего словаря

# Увеличение всех значений на 10
original = {"a": 1, "b": 2, "c": 3}
new_dict = {k: v + 10 for k, v in original.items()}
print(new_dict)   # {'a': 11, 'b': 12, 'c': 13}

Фильтрация словаря:

# Только элементы с чётными значениями
data = {"a": 1, "b": 2, "c": 3, "d": 4}
even_values = {k: v for k, v in data.items() if v % 2 == 0}
print(even_values)   # {'b': 2, 'd': 4}

Генераторы словарей с несколькими циклами

# Все комбинации цветов и размеров
colors = ["red", "green", "blue"]
sizes = ["S", "M", "L"]
combinations = {f"{color}_{size}": (color, size) for color in colors for size in sizes}
print(combinations)
# {'red_S': ('red', 'S'), 'red_M': ('red', 'M'), ...}

Вложенные генераторы словарей

# Матрица в виде словаря
matrix = {i: {j: i * j for j in range(3)} for i in range(3)}
print(matrix)
# {0: {0: 0, 1: 0, 2: 0},
#  1: {0: 0, 1: 1, 2: 2},
#  2: {0: 0, 1: 2, 2: 4}}

Примеры из реальной жизни

Пример 1. Чтение конфигурации:

config_lines = ["host=localhost", "port=8080", "debug=True"]
config = {}
for line in config_lines:
    key, value = line.split("=")
    config[key] = value
print(config)   # {'host': 'localhost', 'port': '8080', 'debug': 'True'}

Пример 2. Группировка данных:

users = [
    {"name": "Анна", "age": 25},
    {"name": "Иван", "age": 30},
    {"name": "Петр", "age": 25}
]

# Группировка по возрасту
age_groups = {}
for user in users:
    age = user["age"]
    if age not in age_groups:
        age_groups[age] = []
    age_groups[age].append(user["name"])
print(age_groups)   # {25: ['Анна', 'Петр'], 30: ['Иван']}

Задачи для закрепления

Задача 1. Создай словарь квадратов чисел от 0 до 5.

Задача 2. Создай словарь из двух списков: keys = ["a", "b", "c"] и values = [1, 2, 3].

Задача 3. Создай словарь, где ключи — числа от 0 до 10, а значения — чётные (True/False).

Задача 4. Создай словарь из словаря {"a": 1, "b": 2, "c": 3}, умножив все значения на 2.

Задача 5. Создай словарь, где ключи — числа от 0 до 10, а значения — их квадраты, но только для чётных чисел.

Ответы:

Задача 1.

squares = {x: x ** 2 for x in range(6)}
print(squares)   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Задача 2.

keys = ["a", "b", "c"]
values = [1, 2, 3]
my_dict = {k: v for k, v in zip(keys, values)}
print(my_dict)   # {'a': 1, 'b': 2, 'c': 3}

Задача 3.

even_dict = {x: x % 2 == 0 for x in range(11)}
print(even_dict)   # {0: True, 1: False, 2: True, ...}

Задача 4.

original = {"a": 1, "b": 2, "c": 3}
new_dict = {k: v * 2 for k, v in original.items()}
print(new_dict)   # {'a': 2, 'b': 4, 'c': 6}

Задача 5.

even_squares = {x: x ** 2 for x in range(11) if x % 2 == 0}
print(even_squares)   # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64, 10: 100}

Нюансы и подводные камни

Уникальные ключи

Ключи в словаре должны быть уникальными. Если два элемента имеют одинаковый ключ, последний перезапишет первый.

# Ошибка! Ключи не уникальны
# Неопределённое поведение

Путаница между {} для словаря и множества

# Словарь (ключ: значение)
{x: x ** 2 for x in range(5)}   # {}

# Множество (только значения)
{x ** 2 for x in range(5)}   # set()

Генератор словаря vs цикл

Генератор словаря работает быстрее и короче.

# Медленно (цикл)
squares = {}
for x in range(1000000):
    squares[x] = x ** 2

# Быстро (генератор)
squares = {x: x ** 2 for x in range(1000000)}

Частые ошибки и как их избежать

Ошибка 1: Неправильный синтаксис

# Неправильно (забыл двоеточие)
{x x ** 2 for x in range(5)}

# Правильно
{x: x ** 2 for x in range(5)}

Ошибка 2: Путаница между словарём и множеством

Для словаря используй {} с ключами, для множества — {} без ключей.

Ошибка 3: Неуникальные ключи

Проверяй, что ключи уникальны.

Шпаргалка

Что нужноКак пишется
Базовый генератор{k: v for k, v in iterable}
С условием (фильтрация){k: v for k, v in data.items() if cond}
С условием (преобразование){k: expr1 if cond else expr2 for k, v in data.items()}
Из двух списков{k: v for k, v in zip(keys, values)}
Вложенный генератор{k: {k2: v2 for k2, v2 in data2.items()} for k, v in data.items()}

Заключение / Выводы

Сегодня мы:

  • Узнали, что такое генераторы словарей
  • Изучили синтаксис и базовые примеры
  • Разобрали условия в генераторах
  • Познакомились с вложенными генераторами

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×