УПРАЖНЕНИЯ
6-4 . Глоссарий 2: теперь, когда вы знаете, как перебрать элементы словаря, упростите код
из упражнения 6-3, заменив серию команд print циклом, перебирающим ключи и значения
словаря . Когда вы будете уверены в том, что цикл работает, добавьте в глоссарий еще пять
терминов Python . При повторном запуске программы новые слова и значения должны быть
автоматически включены в вывод .
6-5 . Реки: создайте словарь с тремя большими реками и странами, по которым протекает
каждая река . Одна из возможных пар «ключ—значение» — ‘nile’: ‘egypt’ .
• Используйте цикл для вывода сообщения с упоминанием реки и страны — например,
«The Nile runs through Egypt .»
• Используйте цикл для вывода названия каждой реки, включенной в словарь .
• Используйте цикл для вывода названия каждой страны, включенной в словарь .
6-6 . Опрос: Возьмите за основу код favorite_languages .py (с . 106) .
• Создайте список людей, которые должны участвовать в опросе по поводу любимо-
го языка программирования . Включите некоторые имена, которые уже присутствуют
в списке, и некоторые имена, которых в списке еще нет .
• Переберите список людей, которые должны участвовать в опросе . Если они уже прош-
ли опрос, выведите сообщение с благодарностью за участие . Если они еще не про-
ходили опрос, выведите сообщение с предложением принять участие .
Вложение
Иногда нужно сохранить множество словарей в списке или сохранить спи-
сок как значение элемента словаря. Создание сложных структур такого рода
называется вложением. Вы можете вложить множество словарей в список,
список элементов в словарь или даже словарь внутрь другого словаря. Как
наглядно показывают следующие примеры, вложение — чрезвычайно мощный
механизм.
Список словарей
Словарь
alien_0
содержит разнообразную информацию об одном пришельце, но
в нем нет места для хранения информации о втором пришельце, не говоря уже
о целом экране, забитом пришельцами. Как смоделировать флот вторжения? На-
пример, можно создать список пришельцев, в котором каждый элемент представ-
ляет собой словарь с информацией о пришельце. Следующий код строит список
из трех пришельцев:
aliens.py
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
114 Глава 6 • Словари
aliens = [alien_0, alien_1, alien_2]
for alien in aliens:
print(alien)
Сначала создаются три словаря, каждый из которых представляет отдельного при-
шельца. В точке каждый словарь заносится в список с именем
aliens
. Наконец,
программа перебирает список и выводит каждого пришельца:
{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15}
Конечно, в реалистичном примере будут использоваться более трех пришельцев,
которые будут генерироваться автоматически. В следующем примере функция
range()
создает флот из 30 пришельцев:
# Создание пустого списка для хранения пришельцев.
aliens = []
# Создание 30 зеленых пришельцев.
for alien_number in range(30):
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
aliens.append(new_alien)
# Вывод первых 5 пришельцев:
for alien in aliens[:5]:
print(alien)
print("...")
# Вывод количества созданных пришельцев.
print("Total number of aliens: " + str(len(aliens)))
В начале примера список для хранения всех пришельцев, которые будут созданы,
пуст. В точке функция
range()
возвращает множество чисел, которое просто
сообщает Python, сколько раз должен повторяться цикл. При каждом выполнении
цикла создается новый пришелец , который затем добавляется в список
aliens
.
В точке срез используется для вывода первых пяти пришельцев, а в точке
выводится длина списка (для демонстрации того, что программа действительно
сгенерировала весь флот из 30 пришельцев):
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
...
Total number of aliens: 30
Все пришельцы обладают одинаковыми характеристиками, но Python рассматри-
вает каждого пришельца как отдельный объект, что позволяет изменять атрибуты
каждого владельца по отдельности.
Как работать с таким множеством? Представьте, что в этой игре некоторые при-
шельцы изменяют цвет и начинают двигаться быстрее. Когда приходит время
Вложение 115
смены цветов, мы можем воспользоваться циклом
for
и командой
if
для изме-
нения цвета. Например, чтобы превратить первых трех пришельцев в желтых,
двигающихся со средней скоростью и приносящих игроку по 10 очков, можно
действовать так:
# Создание пустого списка для хранения пришельцев.
aliens = []
# Создание 30 зеленых пришельцев.
for alien_number in range (0,30):
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
aliens.append(new_alien)
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
# Вывод первых 5 пришельцев:
for alien in aliens[0:5]:
print(alien)
print("...")
Чтобы изменить первых трех пришельцев, мы перебираем элементы среза, включа-
ющего только первых трех пришельцев. В данный момент все пришельцы зеленые
(
'green'
), но так будет не всегда, поэтому мы пишем команду
if
, которая гаранти-
рует, что изменяться будут только зеленые пришельцы. Если пришелец зеленый,
то его цвет меняется на желтый (
'yellow'
), скорость на среднюю (
'medium'
), а на-
града увеличивается до 10 очков:
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
...
Цикл можно расширить, добавив блок
elif
для превращения желтых пришельцев
в красных — быстрых и приносящих игроку по 15 очков. Мы не станем приводить
весь код, а цикл выглядит так:
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
elif alien['color'] == 'yellow':
alien['color'] = 'red'
alien['speed'] = 'fast'
alien['points'] = 15
Решение с хранением словарей в списке достаточно часто встречается тогда, когда
каждый словарь содержит разные атрибуты одного объекта. Например, вы можете
116 Глава 6 • Словари
создать словарь для каждого пользователя сайта, как это было сделано в програм-
ме
user .py
на с. 108, и сохранить отдельные словари в списке с именем
users
. Все
словари в списке должны иметь одинаковую структуру, чтобы вы могли перебрать
список и выполнить с каждым объектом словаря одни и те же операции.
Список в словаре
Иногда бывает удобно поместить список в словарь, вместо того чтобы помещать
словарь в список. Представьте, как бы вы описали в программе заказанную пиццу.
Если ограничиться только списком, сохранить удастся разве что список дополне-
ний к пицце. При использовании словаря список дополнений может быть всего
лишь одним аспектом описания пиццы.
В следующем примере для каждой пиццы сохраняются два вида информации: тип
теста и список дополнений. Список дополнений представляет собой значение,
связанное с ключом
'toppings'
. Чтобы использовать элементы в списке, нужно
указать имя словаря и ключ
'toppings'
, как и для любого другого значения в сло-
варе. Вместо одного значения будет получен список дополнений:
Достарыңызбен бөлісу: |