Izuchaem Python Legal
Izuchaem Python Legal
Эта команда for не отличается от других команд for, если не считать того, что
метод dictionary.keys() заключен в вызов функции sorted(). Эта конструкция
приказывает Python выдать список всех ключей в словаре и отсортировать его
перед тем, как перебирать элементы. В выводе перечислены все пользователи,
участвовавшие в опросе, а их имена упорядочены по алфавиту:
Edward, thank you for taking the poll.
Jen, thank you for taking the poll.
Phil, thank you for taking the poll.
Sarah, thank you for taking the poll.
favorite_languages = {
...
}
Словари легко перепутать с множествами, потому что обе структуры заключаются в фи-
гурные скобки. Когда вы видите фигурные скобки без пар «ключ-значение», скорее
всего, перед вами множество. В отличие от списков и словарей, элементы множеств не
хранятся в каком-либо определенном порядке.
120 Глава 6 • Словари
УПРАЖНЕНИЯ
6.4. Глоссарий 2: теперь, когда вы знаете, как перебрать элементы словаря, упростите код
из упражнения 6.3, заменив серию команд print циклом, перебирающим ключи и значе-
ния словаря. Когда вы будете уверены в том, что цикл работает, добавьте в глоссарий еще
пять терминов Python. При повторном запуске программы новые слова и значения должны
быть автоматически включены в вывод.
6.5. Реки: создайте словарь с названиями трех больших рек и стран, по которым протекает
каждая река. Одна из возможных пар «ключ-значение» — 'nile': 'egypt'.
• Используйте цикл для вывода сообщения с упоминанием реки и страны — напри-
мер, «The Nile runs through Egypt».
• Используйте цикл для вывода названия каждой реки, включенной в словарь.
• Используйте цикл для вывода названия каждой страны, включенной в словарь.
6.6. Опрос: возьмите за основу код favorite_languages.py (с. 115).
• Создайте список людей, которые должны участвовать в опросе по поводу любимого
языка программирования. Включите некоторые имена, которые уже присутствуют
в списке, и некоторые имена, которых в списке еще нет.
• Переберите список людей, которые должны участвовать в опросе. Если они уже
прошли опрос, выведите сообщение с благодарностью за участие. Если они еще не
проходили опрос, выведите сообщение с предложением принять участие.
Вложение
Иногда бывает нужно сохранить множество словарей в списке или сохранить
список как значение элемента словаря. Создание сложных структур такого
рода называется вложением. Вы можете вложить множество словарей в список,
список элементов в словарь или даже словарь внутрь другого словаря. Как на-
глядно показывают следующие примеры, вложение — чрезвычайно мощный
механизм.
Список словарей
Словарь alien_0 содержит разнообразную информацию об одном пришельце, но
в нем нет места для хранения информации о втором пришельце, не говоря уже
о целом экране, забитом пришельцами. Как смоделировать флот вторжения?
Например, можно создать список пришельцев, в котором каждый элемент пред-
ставляет собой словарь с информацией о пришельце. Например, следующий код
строит список из трех пришельцев:
aliens.py
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
Вложение 121
В начале примера список для хранения всех пришельцев, которые будут созданы,
пуст. В точке функция 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}
...
Цикл можно расширить, добавив блок elif для превращения желтых пришельцев
в красных — быстрых и приносящих игроку по 15 очков. Мы не станем приводить
весь код, а цикл выглядит так:
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
Вложение 123
Список в словаре
Вместо того чтобы помещать словарь в список, иногда бывает удобно поместить
список в словарь. Представьте, как бы вы описали в программе заказанную пиццу.
Если ограничиться только списком, сохранить удастся разве что список топпингов
к пицце. При использовании словаря список топпингов может быть всего лишь
одним аспектом описания пиццы.
В следующем примере для каждой пиццы сохраняются два вида информации: осно-
ва и список топпингов. Список топпингов представляет собой значение, связанное
с ключом 'toppings'. Чтобы использовать элементы в списке, нужно указать имя
словаря и ключ 'toppings', как и для любого другого значения в словаре. Вместо
одного значения будет получен список топпингов:
pizza.py
# Сохранение информации о заказанной пицце.
❶ pizza = {
'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese'],
}
# Описание заказа.
❷ print(f"You ordered a {pizza['crust']}-crust pizza "
"with the following toppings:")
ний пишется цикл for . Чтобы вывести список топпингов, мы используем ключ
'toppings', а Python берет список топпингов из словаря.
Следующее сообщение описывает пиццу, которую мы собираемся создать:
Вложение списка в словарь может применяться каждый раз, когда с одним ключом
словаря должно быть связано более одного значения. Если бы в предыдущем при-
мере с языками программирования ответы сохранялись в списке, один участник
опроса мог бы выбрать сразу несколько любимых языков. При переборе словаря
значение, связанное с каждым человеком, представляло бы собой список языков
(вместо одного языка). В цикле for словаря создается другой цикл для перебора
списка языков, связанных с каждым участником:
favorite_languages.py
❶ favorite_languages = {
'jen': ['python', 'ruby'],
'sarah': ['c'],
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'],
}
Словарь в словаре
Словарь также можно вложить в другой словарь, но в таких случаях код быстро
усложняется. Например, если на сайте есть несколько пользователей с уникаль-
ными именами, вы можете использовать имена пользователей как ключи в сло-
варе. Информация о каждом пользователе при этом хранится в словаре, который
используется как значение, связанное с именем. В следующем примере о каждом
пользователе хранится три вида информации: имя, фамилия и место жительства.
Чтобы получить доступ к этой информации, переберите имена пользователей
и словарь с информацией, связанной с каждым именем:
many_users.py
users = {
'aeinstein': {
'first': 'albert',
'last': 'einstein',
'location': 'princeton',
},
'mcurie': {
'first': 'marie',
'last': 'curie',
'location': 'paris',
},
}
Username: mcurie
Full name: Marie Curie
Location: Paris
УПРАЖНЕНИЯ
6.7. Люди: начните с программы, написанной для упражнения 6.1 (с. 113). Создайте два но-
вых словаря, представляющих разных людей, и сохраните все три словаря в списке с име-
нем people. Переберите элементы списка людей. В процессе перебора выведите всю имею-
щуюся информацию о каждом человеке.
6.8. Домашние животные: создайте несколько словарей, имена которых представляют
клички домашних животных. В каждом словаре сохраните информацию о виде животно-
го и имени владельца. Сохраните словари в списке с именем pets. Переберите элементы
списка. В процессе перебора выведите всю имеющуюся информацию о каждом животном.
6.9. Любимые места: создайте словарь с именем favorite_places. Придумайте названия
трех мест, которые станут ключами словаря, и сохраните для каждого человека от одного
до трех любимых мест. Чтобы задача стала более интересной, опросите нескольких друзей
и соберите реальные данные для своей программы. Переберите данные в словаре, выведите
имя каждого человека и его любимые места.
6.10. Любимые числа: измените программу из упражнения 6.2 (с. 114), чтобы для каждого
человека можно было хранить более одного любимого числа. Выведите имя каждого чело-
века в списке и его любимые числа.
6.11. Города: создайте словарь с именем cities. Используйте названия трех городов в ка-
честве ключей словаря. Создайте словарь с информацией о каждом городе; включите в него
страну, в которой расположен город, примерную численность населения и один примеча-
Итоги 127
тельный факт, относящийся к этому городу. Ключи словаря каждого города должны назы-
ваться country, population и fact. Выведите название каждого города и всю сохраненную
информацию о нем.
6.12. Расширение: примеры, с которыми мы работаем, стали достаточно сложными,
и в них можно вносить разного рода усовершенствования. Воспользуйтесь одним из при-
меров этой главы и расширьте его: добавьте новые ключи и значения, измените контекст
программы или улучшите форматирование вывода.
Итоги
В этой главе вы научились определять словари и работать с хранящейся в них
информацией. Вы узнали, как обращаться к отдельным элементам словаря и из-
менять их, как перебрать всю информацию в словаре. Вы научились перебирать
пары «ключ-значение», ключи и значения словаря. Также были рассмотрены воз-
можности вложения словарей в список, вложения списков в словари и вложения
словарей в другие словари.
В следующей главе будут рассмотрены циклы while и получение входных данных
от пользователей программ. Эта глава будет особенно интересной, потому что вы
наконец-то сможете сделать свои программы интерактивными: они начнут реаги-
ровать на действия пользователя.