Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Dict Comprehension в Python
Определение
Dict Comprehension (словарное выражение) — это компактный и элегантный способ создания словарей в Python. Это синтаксический сахар, который позволяет создавать словари одной строкой вместо использования циклов.
Базовый синтаксис
# Общая форма:
{key: value for item in iterable}
# С условием:
{key: value for item in iterable if condition}
Простые примеры
Создание словаря из чисел
# Без comprehension
squares = {}
for i in range(5):
squares[i] = i ** 2
# С comprehension
squares = {i: i ** 2 for i in range(5)}
print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Обращение ключ-значение
original = {"a": 1, "b": 2, "c": 3}
swapped = {value: key for key, value in original.items()}
print(swapped) # {1: "a", 2: "b", 3: "c"}
Dict Comprehension с условиями
Фильтрация элементов
# Только чётные числа
even_squares = {i: i ** 2 for i in range(10) if i % 2 == 0}
print(even_squares) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
Фильтрация слов
words = ["cat", "elephant", "dog", "butterfly"]
word_lengths = {word: len(word) for word in words if len(word) > 3}
print(word_lengths) # {"elephant": 8, "butterfly": 9}
Практические примеры
Подсчёт частоты символов
text = "hello world"
char_count = {char: text.count(char) for char in set(text) if char != " "}
print(char_count) # {"h": 1, "e": 1, "l": 3, "o": 2, "w": 1, "r": 1, "d": 1}
Преобразование JSON данных
users = [
{"id": 1, "name": "Alice", "age": 30},
{"id": 2, "name": "Bob", "age": 25},
{"id": 3, "name": "Charlie", "age": 35},
]
user_names = {user["id"]: user["name"] for user in users}
print(user_names) # {1: "Alice", 2: "Bob", 3: "Charlie"}
Фильтрация и преобразование
numbers = [-3, -1, 0, 2, 4, -5, 7]
positive_squares = {n: n**2 for n in numbers if n > 0}
print(positive_squares) # {2: 4, 4: 16, 7: 49}
Преобразование двух списков в словарь
keys = ["a", "b", "c", "d"]
values = [1, 2, 3, 4]
result = {k: v for k, v in zip(keys, values)}
print(result) # {"a": 1, "b": 2, "c": 3, "d": 4}
Вложенные Dict Comprehensions
Таблица умножения
times_table = {f"{i}x{j}": i * j for i in range(1, 4) for j in range(1, 4)}
print(times_table) # {"1x1": 1, "1x2": 2, "1x3": 3, ..., "3x3": 9}
Вложенные словари
matrix = {i: {j: i + j for j in range(3)} for i in range(3)}
print(matrix) # {0: {0: 0, 1: 1, 2: 2}, 1: {0: 1, 1: 2, 2: 3}, ...}
Сравнение производительности
Dict comprehension обычно быстрее циклов на 30-40% благодаря оптимизации интерпретатора Python:
import timeit
# Comprehension
time1 = timeit.timeit(
lambda: {i: i**2 for i in range(1000)},
number=10000
)
# Цикл
def loop_dict():
d = {}
for i in range(1000):
d[i] = i**2
return d
time2 = timeit.timeit(loop_dict, number=10000)
print(f"Comprehension: {time1:.4f}s")
print(f"Loop: {time2:.4f}s")
Особенности область видимости
# Переменные из comprehension не видны снаружи
result = {x: x**2 for x in range(5)}
print(x) # NameError
# В обычном цикле переменная существует
for x in range(5):
pass
print(x) # 4
Dict comprehension vs другие методы
data = [("a", 1), ("b", 2), ("c", 3)]
# Comprehension
result1 = {k: v for k, v in data}
# dict() с zip
result2 = dict(data)
# Все дают одинаковый результат, но comprehension более явный
print(result1 == result2) # True
Лучшие практики
✅ Используй для простых трансформаций:
result = {k: v.upper() for k, v in data.items()}
✅ Чередуй условия правильно:
result = {k: v for k, v in data.items() if v > 10}
✅ Используй вложенные comprehensions для структурированных данных:
result = {i: {j: i*j for j in range(3)} for i in range(3)}
❌ Избегай слишком сложной логики в comprehension: Если нужна сложная условная логика — используй обычный цикл для чтения кода.
Выводы
- Dict Comprehension — мощный инструмент для создания словарей в одну строку
- Более читаемо, чем циклы для простых случаев
- Более эффективно по производительности (30-40% быстрее)
- Соответствует философии Python (Pythonic)
- Идеально для фильтрации, трансформации и объединения данных
- Для сложной логики лучше использовать обычные циклы