{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
...
Total number of aliens: 30
Все пришельцы обладают одинаковыми характеристиками, но Python рассматривает каждого пришельца как отдельный объект, что позволяет изменять атрибуты каждого владельца по отдельности.
Как работать с таким множеством? Представьте, что в этой игре некоторые пришельцы изменяют цвет и начинают двигаться быстрее. Когда приходит время смены цветов, мы можем воспользоваться циклом 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
Решение с хранением словарей в списке достаточно часто встречается тогда, когда каждый словарь содержит разные атрибуты одного объекта. Например, вы можете создать словарь для каждого пользователя сайта, как это было сделано в программе user.py на с. 108, и сохранить отдельные словари в списке с именем users. Все словари в списке должны иметь одинаковую структуру, чтобы вы могли перебрать список и выполнить с каждым объектом словаря одни и те же операции.
Список в словаре
Иногда бывает удобно поместить список в словарь, вместо того чтобы помещать словарь в список. Представьте, как бы вы описали в программе заказанную пиццу. Если ограничиться только списком, сохранить удастся разве что список дополнений к пицце. При использовании словаря список дополнений может быть всего лишь одним аспектом описания пиццы.
В следующем примере для каждой пиццы сохраняются два вида информации: тип теста и список дополнений. Список дополнений представляет собой значение, связанное с ключом 'toppings'. Чтобы использовать элементы в списке, нужно указать имя словаря и ключ 'toppings', как и для любого другого значения в словаре. Вместо одного значения будет получен список дополнений:
pizza.py
# Сохранение информации о заказанной пицце.
(1) pizza = {
. .'crust': 'thick',
. .'toppings': ['mushrooms', 'extra cheese'],
. .}
# Описание заказа.
(2)print("You ordered a " + pizza['crust'] + "-crust pizza " +
. ."with the following toppings:")
(3)for topping in pizza['toppings']:
. .print("\t" + topping)
Работа начинается в точке (1) со словаря с информацией о заказанной пицце. С ключом в словаре 'crust' связано строковое значение 'thick'. С другим ключом 'toppings' связано значение-список, в котором хранятся все заказанные дополнения. В точке (2) выводится описание заказа перед созданием пиццы. Чтобы вывести список дополнений, мы используем ключ 'toppings', а Python берет список дополнений из словаря.
Следующее сообщение описывает пиццу, которую мы собираемся создать:
You ordered a thick-crust pizza with the following toppings:
. .mushrooms
. .extra cheese
Вложение списка в словарь может применяться каждый раз, когда с одним ключом словаря должно быть связано более одного значения. Если бы в предыдущем примере с языками программирования ответы сохранялись в списке, один участник опроса мог бы выбрать сразу несколько любимых языков. При переборе словаря значение, связанное с каждым человеком, представляло бы собой список языков (вместо одного языка.) В цикле for словаря создается другой цикл для перебора списка языков, связанных с каждым участником:
favorite_languages.py
(1) favorite_languages = {
. .'jen': ['python', 'ruby'],
. .'sarah': ['c'],
. .'edward': ['ruby', 'go'],
. .'phil': ['python', 'haskell'],