JavaRush /Курсы /Модуль 1: Python Core /Циклы и генераторы словарей

Циклы и генераторы словарей

Модуль 1: Python Core
7 уровень , 5 лекция
Открыта

6.1 Использование enumerate()

Мы уже рассмотрели работу с циклами по keys, values и items в словарях. Теперь давайте подробнее разберем функцию enumerate().

Функция enumerate() полезна для перебора элементов словаря, предоставляя доступ как к индексам, так и к ключам и значениям.

Вот несколько примеров использования enumerate() со словарями:

Итерация по ключам и значениям словаря с индексами

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


# Словарь с данными о человеке
person = {"name": "Alice", "age": 25, "city": "New York"}

# Перебор ключей и значений словаря с индексами
for index, (key, value) in enumerate(person.items()):
    print(f"Индекс: {index}, Ключ: {key}, Значение: {value}")
    # Выводит индекс, ключ и значение каждого элемента словаря

Вывод:


Индекс: 0, Ключ: name, Значение: Alice
Индекс: 1, Ключ: age, Значение: 25
Индекс: 2, Ключ: city, Значение: New York

Преобразование значений словаря с использованием индексов

Вы можете использовать enumerate(), чтобы изменить значения словаря в зависимости от их индекса.


# Исходный словарь
person = {"name": "Alice", "age": 25, "city": "New York"}

# Новый словарь с индексами в значениях
indexed_person = {}
for index, (key, value) in enumerate(person.items()):
    indexed_person[key] = f"{value}_{index}"
    # Присваиваем значению в словаре индекс в виде строки

print(indexed_person) 
# Выводит словарь с индексами, добавленными к значениям

Вывод:


{'name': 'Alice_0', 'age': '25_1', 'city': 'New York_2'}

Использование enumerate() для создания нового словаря

Вы можете использовать enumerate() для создания нового словаря, где индексы будут ключами.


# Исходный словарь
person = {"name": "Alice", "age": 25, "city": "New York"}

# Новый словарь, где индексы используются как ключи
indexed_person = {index: (key, value) for index, (key, value) in enumerate(person.items())}
print(indexed_person)
# Выводит новый словарь с индексами в качестве ключей

Вывод:


{0: ('name', 'Alice'), 1: ('age', 25), 2: ('city', 'New York')}

6.2 Генераторы словарей

Мы уже использовали List Comprehensions для генерации списков и Set Comprehensions для генерации множеств. Аналогично можно использовать синтаксис генераторов для создания словарей. Dictionary Comprehensions (генераторы словарей) позволяют писать более краткий и читаемый код для создания словарей.

Основной синтаксис dictionary comprehension выглядит следующим образом:


{выражение1: выражение2 for переменная in последовательность if условие}

где

  • переменная — переменная, которая принимает значение каждого элемента из итерируемого объекта.
  • последовательность — итерируемый объект (например, список, кортеж, строка), который проходит по данной переменной.
  • выражение1 — выражение для генерации ключей словаря. Обычно зависит от переменной.
  • выражение2 — выражение для генерации значений словаря.
  • условие — (опционально) условие, которое должно быть выполнено для включения элемента в словарь.

Пример 1:

Создание словаря с квадратами чисел


# Создание словаря, где ключи — числа от 1 до 5, а значения — их квадраты
squares = {x: x ** 2 for x in range(1, 6)}
print(squares)  # Вывод: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Пример 2:

Создание словаря из списка кортежей


# Список кортежей, содержащих пары ключ-значение
pairs = [("name", "Alice"), ("age", 25), ("city", "New York")]

# Генерация словаря из списка кортежей
person = {key: value for key, value in pairs}
print(person)  # Вывод: {'name': 'Alice', 'age': 25, 'city': 'New York'}

Пример 3:

Фильтрация элементов при создании словаря


# Создание словаря, где ключи — числа от 1 до 10, а значения — их квадраты
# Только для четных чисел
even_squares = {x: x ** 2 for x in range(1, 11) if x % 2 == 0}
print(even_squares)  # Вывод: {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}

Пример 4:

Преобразование элементов при создании словаря


# Список строк
words = ["apple", "banana", "cherry"]

# Генерация словаря, где ключи — строки, а значения — их длины
word_lengths = {word: len(word) for word in words}
print(word_lengths)  # Вывод: {'apple': 5, 'banana': 6, 'cherry': 6}

Вложенные dictionary comprehensions


# Список списков с парами ключ-значение
nested_pairs = [[("a", 1), ("b", 2)], [("c", 3), ("d", 4)]]

# Генерация словаря из вложенного списка
nested_dict = {key: value for sublist in nested_pairs for key, value in sublist}
print(nested_dict)  # Вывод: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

Комбинированные способы

Можно комбинировать разные способы создания словарей для более сложных случаев.


# Объединение нескольких словарей в один
dict1 = {"name": "John", "age": 30}
dict2 = {"city": "New York", "country": "USA"}
combined_dict = {**dict1, **dict2}
print(combined_dict)  # Вывод: {'name': 'John', 'age': 30, 'city': 'New York', 'country': 'USA'}

Использование оператора ** перед именем словаря позволяет распаковать его элементы, как будто они перечислены в ряд. Таким образом, выражение {**dict1, **dict2} фактически объединяет элементы обоих словарей.

2
Задача
Модуль 1: Python Core, 7 уровень, 5 лекция
Недоступна
Индексация студентов.
Индексация студентов.
2
Задача
Модуль 1: Python Core, 7 уровень, 5 лекция
Недоступна
Словарь из списка кортежей.
Словарь из списка кортежей.
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Рустем Уровень 14
31 августа 2025
employees = [("Alex", "manager"), ("Maria", "web-dev")] empl_dict = {ind : value for ind, value in employees} print(empl_dict) но валидатор не согласен с самого начала: Не выполнены все требования задачи (если быть точным, то ни одного)
SWK Уровень 26
27 марта 2025
Кому-нибудь помогло нижеприведённое пояснение?

Использование оператора ** перед именем словаря позволяет распаковать его элементы, 
как будто они перечислены в ряд. Таким образом, выражение {**dict1, **dict2} фактически 
объединяет элементы обоих словарей. 
Как оно срабатывает, понятно из примера, в нём результат приведён. Как оно работает в общем случае, понятно не стало совершенно. Там маркоподстановка производится, видимо?
Slevin Уровень 64
27 июня 2025
Используется: - в вызовах функций для передачи аргументов по имени, - при объединении словарей.

def func(a, b):
    print(a, b)

params = {'a': 1, 'b': 2}
func(**params)  # → 1 2
Имена ключей (атрибутов) должны совпадать с именами параметров функции
Александр Уровень 12
1 ноября 2025
Все случаи использования * и ** (кроме математики) 1. В определении функций *args — собирает все позиционные аргументы в кортеж: def f(*args): print(args) f(1, 2, 3) # (1, 2, 3) **kwargs — собирает все именованные аргументы в словарь: def f(**kwargs): print(kwargs) f(a=1, b=2) # {'a': 1, 'b': 2} 2. В вызове функций (распаковка) * — распаковка последовательности в позиционные аргументы: nums = [1, 2, 3] print(*nums) # вызов функции print() >>> 1 2 3 ** — распаковка словаря в именованные аргументы: d = {"x": 1, "y": 2} def f(x, y): print(x, y) f(**d) # 1 2 3. В литералах коллекций: [], (), {...}, {} Списки / кортежи / множества / Словари — распаковка: a = [1, 2] b = [*a, 3, 4] # [1, 2, 3, 4] d1 = {"a": 1} d2 = {"b": 2} merged = {**d1, **d2} # {'a': 1, 'b': 2} 4. В сигнатурах функций для ограничения передачи аргументов * как разделитель: всё, что идёт после него, должно передаваться только как именованные аргументы. def f(a, b, *, c, d): print(a, b, c, d) f(1, 2, c=3, d=4) # OK f(1, 2, 3, 4) # Ошибка В комбинации с / (Python 3.8+): def f(a, /, b, *, c): ... всё до / — только позиционные аргументы всё после * — только именованные 5. В циклах и присваиваниях (распаковка с «звёздочкой») Сбор остатка элементов: a, *b, c = [1, 2, 3, 4, 5] print(a) # 1 print(b) # [2, 3, 4] print(c) # 5
SWK Уровень 26
27 марта 2025
По поводу замечательного примера:

# Список списков с парами ключ-значение
nested_pairs = [[("a", 1), ("b", 2)], [("c", 3), ("d", 4)]]
# Генерация словаря из вложенного списка
nested_dict = {key: value for sublist in nested_pairs for key, value in sublist}
print(nested_dict)  # Вывод: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
1. Сдаётся мне, того, кто будет так программировать, быстро уволят. 2. Если приводите этакие крокозябры, ну поясните, чего у него for-ы шиворот-навыворот стоят...
Mongoose Уровень 16
4 декабря 2025
Генератор словаря {key: value for sublist in nested_pairs for key, value in sublist} создает словарь из вложенного списка nested_pairs, где каждый вложенный список sublist содержит пары (ключ, значение), которые напрямую используются для создания нового словаря. Этот метод позволяет эффективно преобразовать структуру данных, например, список списков пар, в плоский словарь. Как это работает: nested_pairs: Это исходный вложенный список. В примере, это список, содержащий другие списки или кортежи, каждый из которых состоит из пар ключ-значение. for sublist in nested_pairs: Это внешний цикл, который перебирает каждый внутренний список (или другую итерируемую коллекцию) внутри nested_pairs. for key, value in sublist: Это внутренний цикл, который проходит по каждой паре (key, value) внутри текущего sublist. key: value: Для каждой найденной пары создается новая пара ключ-значение в итоговом словаре.
SWK Уровень 26
27 марта 2025

Вы можете использовать enumerate(), чтобы изменить значения словаря в зависимости от их индекса. 
В зависимости от того индекса, который им случайно только что присвоился. А зачем?
UnknownReboot Уровень 30
24 января 2025
Валидатору не понравилось имя студента "MIT" - Значения для ключей должны быть скорректированы для корректного отображения информации о студенте. Например, 'имя' должно соответствовать имени человека, а не названию университета. В итоге "Ваня" принял.
UnknownReboot Уровень 30
24 января 2025
Была задача - "Напишите функцию create_cat_profile(name: str, age: int, **kwargs: str) -> None, которая принимает имя и возраст кота в качестве обязательных параметров" Вот эта лекция значительно упростила бы ее решение. А так пришлось самому копать.
Маруся Уровень 23
21 января 2025
я после этой лекции: *_____*
SWK Уровень 26
27 марта 2025
Это фас или профиль?
Slevin Уровень 64
27 июня 2025
это анусай