Циклы со словарями в Python

Материал из Викижурнал
Циклы со словарями в Python
Циклы со словарями в Python
Циклы со словарями в Python
Тематические порталы

В предыдущих статьях мы рассмотрели тему про словари в Python, и какие основные операции можно с ними делать. В этой статье мы продолжим тему словарей и рассмотрим, как и для чего можно применять циклы со словарями.

Один словарь в Python может содержать всего от нескольких пар "ключ-значение" до миллионов. Так как словарь может содержать большие объемы данных, Python позволяет перебирать словарь. Словари можно использовать для хранения информации разными способами; поэтому существует различные способы их обработки. Можно просматривать все пары "ключ-значение" словаря, его ключи или значения.

Выполнение цикла всех "ключей" словаря

Прежде чем исследовать различные подходы к созданию циклов, давайте сделаем новый словарь, предназначенный для хранения информации о пользователе на веб-сайте. Следующий словарь будет хранить название учётной записи, имя и фамилию одного пользователя:

user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',
    }

Можно получить доступ к любой отдельной информации переменной user_0 на основе того, что вы уже узнали в прошлых статьях о словарях. Но что, если вы хотите увидеть все, что хранится в словаре этого пользователя? Для этого вы можете перебрать словарь, используя цикл for:

user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',
    }

for key, value in user_0.items():
    print("\nKey: " + key)
    print("Value: " + value)

Как показано, чтобы написать цикл for для словаря, вы создаете имена для двух переменных, которые будут содержать ключ и значение в каждой паре "ключ-значение". Можно выбрать любые имена для этих двух переменных. Этот код работал бы так же хорошо, если бы вы использовали сокращения для имен переменных, например так:

for k, v in user_0.items()

Вторая половина цикла for содержит имя словаря, за которым следует метод items(), который возвращает список пар "ключ-значение". Затем цикл for сохраняет каждую из этих пар в двух предоставленных переменных. В предыдущем примере используются переменные для печати каждого ключа, а затем связанное значение. «\n» в первом операторе печати обеспечивает вставку пустой строки перед каждой парой ключ-значение в выводе данных:

Key: last
Value: fermi

Key: first
Value: enrico

Key: username
Value: efermi

Еще раз обратите внимание, что пары "ключ-значение" не возвращаются в том порядке, в котором они были сохранены, даже при циклическом просмотре словаря. Python не заботится о порядке, в котором хранятся пары ключ-значение; он отслеживает только связи между отдельными ключами и их значениями.

Циклическая переборка всех пар "ключ-значение" особенно эффективна для таких словарей, где хранится информация одного и того же типа для множества разных ключей, на примере кода с любимыми языками программирования. Если перебирать словарь, то получаете имя каждого человека в словаре и его любимый язык программирования. Поскольку ключи всегда ссылаются на имя человека, а значение всегда является языком, используются переменные имя и язык в цикле вместо ключа и значения. Это облегчит следить за тем, что происходит внутри цикла:

favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }
for name, language in favorite_languages.items():
    print(name.title() + "'s favorite language is " + language.title() + ".")

Код сообщает Python зацикливаться на каждой паре "ключ-значение" в словаре. Так как он работает через каждую пару, ключ сохраняется в имени переменной, а значение сохраняется в языке переменной. Эти описательные имена облегчают понимание того, что делает функция print(). Теперь, всего за несколько строк кода, мы можем отобразить всю информацию из опроса:

Jen's favorite language is Python.
Sarah's favorite language is C.
Phil's favorite language is Python.
Edward's favorite language is Ruby.

Этот тип цикла работал бы так же хорошо, если бы в нашем словаре хранились результаты опроса тысячи или даже миллионов человек.

Выполнение цикла "ключей" в определённом порядке

Словарь всегда поддерживает четкую связь между каждым ключом и связанным с ним значением, но вы никогда не получите элементы из словаря в любом предсказуемом порядке. Это не проблема, потому что вы обычно просто хотите получить правильное значение, связанное с каждым ключом.

Один из способов вернуть элементы в определенном порядке - отсортировать ключи по мере их возврата в цикле for. Вы можете использовать функцию sorted(), чтобы получить копию ключей в следующем порядке:

 favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }

for name in sorted(favorite_languages.keys()):
    print(name.title() + ", thank you for taking the poll.")

D данном случае оператор for исполняет команду точно также, как ранее, за исключением того, что мы обернули его в функцию sorted() в методе favorite_languages.keys(). Это сообщает 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.

Выполнение цикла всех значений словаря

Если вас в первую очередь интересуют значения, содержащиеся в словаре, вы можете использовать метод values(), чтобы получить список значений без каких-либо ключей. Например, скажем, мы просто хотим получить список всех языков, выбранных в нашем опросе по языку программирования, без имени человека, который выбрал тот или иной язык программирования:

favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }

print("The following languages have been mentioned:")
for language in favorite_languages.values():
    print(language.title())

Здесь оператор for извлекает каждое значение из словаря и сохраняет его в переменную "language". Затем мы получаем список всех выбранных языков:

The following languages have been mentioned:
Python
C
Python
Ruby

Этот подход извлекает все значения из словаря без проверки повторов в нём. Это может хорошо работать с небольшим количеством значений, но в опросе с большим количеством респондентов это приведет к повторяющемся значениям в списке. Чтобы увидеть каждый язык без повторения, мы можем использовать функцию set(). Так мы избавимся от повторений в списке:

favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }
print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):
    print(language.title())

Когда вы используете функцию set() для списка, который содержит повторяющиеся элементы, Python идентифицирует уникальные элементы в списке и создает набор из этих элементов. То есть мы используем set(), чтобы вытащить уникальные языки в переменной favourite_languages.values(). Результатом является не повторяющийся список языков, которые были упомянуты людьми, принимающими участие в опросе:

The following languages have been mentioned:
Python
C
Ruby

Продолжая изучать Python, вы часто обнаружите встроенные функции языка, которые помогут делать именно то, что задумано с вашими данными.

Примечание

Основная статья: Дополнительные операции со словарями в Python

В этой статье мы разобрали, как можно использовать функции циклов в отношении списков в Python. В дальнейшем эти знания помогут в решении тех или иных задач во время создания программ, игр или приложений. Для продолжения темы словарей в Python предлагаем узнать в статье - Дополнительные операции со словарями в Python, где затрагиваются возможности использования инструментов таких, как словарь в словаре, формирование списков, списки в словарях. Ну а если есть какие-либо комментарии, вопросы по этому материалу, то оставляйте свои сообщения на странице обсуждения.

Другие статьи о Python