Список в словаре

We use cookies. Read the Privacy and Cookie Policy

Иногда бывает удобно поместить список в словарь, вместо того чтобы помещать словарь в список. Представьте, как бы вы описали в программе заказанную пиццу. Если ограничиться только списком, сохранить удастся разве что список дополнений к пицце. При использовании словаря список дополнений может быть всего лишь одним аспектом описания пиццы.

В следующем примере для каждой пиццы сохраняются два вида информации: тип теста и список дополнений. Список дополнений представляет собой значение, связанное с ключом '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(" " + 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'],

. .}

(2)for name, languages in favorite_languages.items():

. .print(" " + name.title() + "'s favorite languages are:")

(3) . .for language in languages:

. . . .print(" " + language.title())

Вы видите в точке (1) , что значение, связанное с каждым именем, теперь представляет собой список. У некоторых участников только один любимый язык программирования, у других таких языков несколько. При переборе словаря в точке (2) переменная с именем languages используется для хранения каждого значения из словаря, потому что мы знаем, что каждое значение будет представлять собой список. В основном цикле по элементам словаря другой цикл (3) перебирает элементы списка любимых языков каждого участника.

Теперь каждый участник опроса может указать сколько угодно любимых языков программирования:

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»).

примечание

Глубина вложения списков и словарей не должна быть слишком большой. Если вам приходится вкладывать элементы на глубину существенно бо?льшую, чем в предыдущих примерах, или если вы работаете с чужим кодом со значительной глубиной вложения, скорее всего, у задачи существует более простое решение.