Словарь в словаре
Словарь также можно вложить в другой словарь, но в таких случаях код быстро усложняется. Например, если на сайте есть несколько пользователей с уникальными именами, вы можете использовать имена пользователей как ключи в словаре. Информация о каждом пользователе при этом хранится в словаре, который используется как значение, связанное с именем. В следующем примере о каждом пользователе хранятся три вида информации: имя, фамилия и место жительства. Чтобы получить доступ к этой информации, переберите имена пользователей и словарь с информацией, связанной с каждым именем:
many_users.py
users = {
. .'aeinstein': {
. . . .'first': 'albert',
. . . .'last': 'einstein',
. . . .'location': 'princeton',
. . . .},
. .'mcurie': {
. . . .'first': 'marie',
. . . .'last': 'curie',
. . . .'location': 'paris',
. . . .},
. .}
(1) for username, user_info in users.items():
(2) . .print(" Username: " + username)
(3) . .full_name = user_info['first'] + " " + user_info['last']
. .location = user_info['location']
(4) . .print(" Full name: " + full_name.title())
. .print(" Location: " + location.title())
В программе определяется словарь с именем users, содержащий два ключа: для пользователей 'aeinstein' и 'mcurie'. Значение, связанное с каждым ключом, представляет собой словарь с именем, фамилией и местом жительства пользователя. В процессе перебора словаря users в точке (1) Python сохраняет каждый ключ в переменной username, а словарь, связанный с каждым именем пользователя, сохраняется в переменной user_info. Внутри основного цикла в словаре выводится имя пользователя (2).
В точке (3) начинается работа с внутренним словарем. Переменная user_info, содержащая словарь с информацией о пользователе, содержит три ключа: 'first', 'last' и 'location'. Каждый ключ используется для построения аккуратно отформатированных данных с полным именем и местом жительства пользователя, с последующим выводом сводки известной информации о пользователе (4):
Username: aeinstein
. .Full name: Albert Einstein
. .Location: Princeton
Username: mcurie
. .Full name: Marie Curie
. .Location: Paris
Обратите внимание на идентичность структур словарей всех пользователей. Хотя Python этого и не требует, наличие единой структуры упрощает работу с вложенными словарями. Если словари разных пользователей будут содержать разные ключи, то код в цикле for заметно усложнится.
Упражнения
6-7. Люди: начните с программы, написанной для упражнения 6-1 (с. 107). Создайте два новых словаря, представляющих разных людей, и сохраните все три словаря в списке с именем people. Переберите элементы списка людей. В процессе перебора выведите всю имеющуюся информацию о каждом человеке.
6-8. Домашние животные: создайте несколько словарей, имена которых представляют клички домашних животных. В каждом словаре сохраните информацию о виде животного и имени владельца. Сохраните словари в списке с именем pets. Переберите элементы списка. В процессе перебора выведите всю имеющуюся информацию о каждом животном.
6-9. Любимые места: создайте словарь с именем favorite_places. Придумайте названия трех мест, которые станут ключами словаря, и сохраните для каждого человека от одного до трех любимых мест. Чтобы задача стала более интересной, опросите нескольких друзей и соберите реальные данные для своей программы. Переберите данные в словаре, выведите имя каждого человека и его любимые места.
6-10. Любимые числа: измените программу из упражнения 6-2 (с. 107), чтобы для каждого человека можно было хранить более одного любимого числа. Выведите имя каждого человека в списке и его любимые числа.
6-11. Города: создайте словарь с именем cities. Используйте названия трех городов в качестве ключей словаря. Создайте словарь с информацией о каждом городе; включите в него страну, в которой расположен город, примерную численность населения и один примечательный факт, относящийся к этому городу. Ключи словаря каждого города должны называться country, population и fact. Выведите название каждого города и всю сохраненную информацию о нем.
6-12. Расширение: примеры, с которыми мы работаем, стали достаточно сложными, и в них можно вносить разного рода усовершенствования. Воспользуйтесь одним из примеров этой главы и расширьте его: добавьте новые ключи и значения, измените контекст программы или улучшите форматирование вывода.