Глава 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'
, как и для любого другого значения в сло-
варе. Вместо одного значения будет получен список дополнений:
pizza.py
# Сохранение информации о заказанной пицце.
pizza = {
'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese'],
}
# Описание заказа.
print("You ordered a " + pizza['crust'] + "-crust pizza " +
"with the following toppings:")
for topping in pizza['toppings']:
print("\t" + topping)
Работа начинается в точке
со словаря с информацией о заказанной пицце.
С ключом в словаре
'crust'
связано строковое значение
'thick'
. С другим ключом
'toppings'
связано значение-список, в котором хранятся все заказанные допол-
нения. В точке
выводится описание заказа перед созданием пиццы. Чтобы вы-
вести список дополнений, мы используем ключ
'toppings'
, а Python берет список
дополнений из словаря.
Следующее сообщение описывает пиццу, которую мы собираемся создать:
You ordered a thick-crust pizza with the following toppings:
mushrooms
extra cheese
Вложение списка в словарь может применяться каждый раз, когда с одним ключом
словаря должно быть связано более одного значения. Если бы в предыдущем при-
мере с языками программирования ответы сохранялись в списке, один участник
опроса мог бы выбрать сразу несколько любимых языков. При переборе словаря
значение, связанное с каждым человеком, представляло бы собой список языков
Вложение
117
(вместо одного языка.) В цикле
for
словаря создается другой цикл для перебора
списка языков, связанных с каждым участником:
favorite_languages.py
favorite_languages = {
'jen': ['python', 'ruby'],
'sarah': ['c'],
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'],
}
for name, languages in favorite_languages.items():
print("\n" + name.title() + "'s favorite languages are:")
for language in languages:
print("\t" + language.title())
Вы видите в точке
, что значение, связанное с каждым именем, теперь представ-
ляет собой список. У некоторых участников только один любимый язык програм-
мирования, у других таких языков несколько. При переборе словаря в точке
переменная с именем
languages
используется для хранения каждого значения
из словаря, потому что мы знаем, что каждое значение будет представлять собой
список. В основном цикле по элементам словаря другой цикл
перебирает эле-
менты списка любимых языков каждого участника.
Теперь каждый участник опроса может указать сколько угодно любимых языков
программирования:
Jen's favorite languages are:
Python
Ruby
Sarah's favorite languages are:
C
Phil's favorite languages are:
Python
Haskell
Edward's favorite languages are:
Ruby
Go
Чтобы дополнительно усовершенствовать программу, включите в начало цикла
for
словаря команду
if
для проверки того, выбрал ли данный участник более одного
языка программирования (проверка основана на значении
len(languages)
). Если
у участника только один любимый язык, текст сообщения изменяется для един-
ственного числа (например, «Sarah’s favorite language is C»).
Достарыңызбен бөлісу: |