Привет! Ты уже знаешь, что генераторы списков позволяют создавать списки в одну строку. Аналогично, в Python есть генераторы словарей — они делают то же самое, но для словарей. Это удобно, когда нужно быстро создать словарь из существующих данных.
В этой статье мы разберём:
- Что такое генератор словаря
- Синтаксис и базовые примеры
- Условия в генераторах словарей
- Вложенные генераторы
- Что нужно знать перед началом
- Основная часть
- Что такое генератор словаря
- Базовые примеры
- Генераторы с условиями
- Преобразование существующего словаря
- Генераторы словарей с несколькими циклами
- Вложенные генераторы словарей
- Примеры из реальной жизни
- Задачи для закрепления
- Нюансы и подводные камни
- Уникальные ключи
- Путаница между {} для словаря и множества
- Генератор словаря vs цикл
- Частые ошибки и как их избежать
- Ошибка 1: Неправильный синтаксис
- Ошибка 2: Путаница между словарём и множеством
- Ошибка 3: Неуникальные ключи
- Шпаргалка
- Заключение / Выводы
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный 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()} |
Заключение / Выводы
Сегодня мы:
- Узнали, что такое генераторы словарей
- Изучили синтаксис и базовые примеры
- Разобрали условия в генераторах
- Познакомились с вложенными генераторами








