Словари

До сих пор вы хранили данные в списках. Например, есть список друзей пользователя. А список английских слов, которые кто-то из этих друзей хочет выучить, мог бы выглядеть так:

english_words = ['hand', 'leg', 'back-end developer']
1

Гораздо удобнее было бы хранить переводы слов с русского на английский, чтобы забытые слова было легко подсмотреть. Для этого в Python есть структура данных dict (от англ. dictionary, «словарь»). Вот как она выглядит:

english = {
    'рука': 'hand',
    'нога': 'leg',
    'бэкенд-разработчик': 'back-end developer'
}
1
2
3
4
5

Словарь оформляется фигурными скобками. Его заполняют пары, записанные через запятую. Первый элемент в паре называется ключ, а второй — значение, они разделяются между собой двоеточием. Русские слова здесь ключи, а их переводы на английский — значения. Когда запрашивают в словаре значение, соответствующее определённому ключу, это называется «доступ по ключу». Так можно получить значение для какого-нибудь ключа и заменить его:

english = {
    'рука': 'hand',
    'нога': 'leg',
    'бэкенд-разработчик': 'back-end developer'
}

# доступ по ключу: как по-английски рука?
print(english['рука'])  # будет напечатано слово hand

english['рука'] = 'arm'
# значение для ключа 'рука' поменялось с 'hand' на 'arm' - другой допустимый перевод
1
2
3
4
5
6
7
8
9
10
11

Ключи в словаре похожи на индексы списков. Только индексами выступают натуральные числа, а ключами бывают и числа обоих типов, и строки, и даже булевы значения True и False:

garden = {
    'земляника': 'ягода',
    'яблоко': 'фрукт',
    'лук': ['овощ', 'оружие']  # значением может быть список
}

print(garden['лук'])
# будет напечатано ['овощ', 'оружие']

garden = {
    'земляника': 'ягода',
    'яблоко': 'фрукт',
    ['морковь', 'кабачок']: 'овощ'  # а так нельзя! ключом список быть не может
}

print(garden[['морковь', 'кабачок']])  # получится ошибка
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

При этом в одном словаре не может быть двух одинаковых ключей.

Чтобы получить все ключи словаря, нужно вызвать метод keys(), а если нужны все значения — метод values():

# 1) получаем ключи словаря
favorite_songs = {
    'Тополиный пух': 'Иванушки international',
    'Город золотой': 'Аквариум',
    'Звезда по имени Солнце': 'Кино'
}

print(favorite_songs.keys())
# будет напечатан список песен
# dict_keys(['Тополиный пух', 'Город золотой', 'Звезда по имени Солнце'])

# 2) получаем значения словаря
old_letters = {'ять': 'Ѣ', 'юс малый': 'Ѧ', 'юс большой': 'Ѫ'}

print(old_letters.values())
# будет напечатан список начертаний старинных букв
# dict_values(['Ѣ', 'Ѧ', 'Ѫ'])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Чтобы такие списки использовать в коде, их обычно превращают в строки методом join():

# словарь отчеств
patronymic = {'Илья': 'Ильич', 'Иван': 'Ивановна', 'Пётр': 'Петровна'}
print(", ".join(patronymic.values()))
# выводится строка: Ильич, Ивановна, Петровна
1
2
3
4
  1. Научим Виту хранить в словаре записи о друзьях и получать к ним доступ по ключу. Напечатайте на экран город, в котором живет Серёга.
{'Серёга': 'Омск', 'Соня': 'Москва', 'Дима': 'Челябинск'}
1
  1. Серёга переехал в Оренбург. Получив по ключу доступ к записи о его городе, отразите этот факт в словаре.

Расширение словаря

Добавим слов в наш небольшой русско-английский словарь:

english = {
    'рука': 'hand',
    'нога': 'leg',
    'бэкенд-разработчик': 'back-end developer'
}
1
2
3
4
5

Сделать это можно несколькими способами:

# просто дописать новую пару в объявление словаря
english = {
    'рука': 'hand',
    'нога': 'leg',
    'бэкенд-разработчик': 'back-end developer',
    'запрос': 'request'  # новая пара ключ-значение
}

# использовать доступ по ключу
english['голова'] = 'head'  # теперь в словаре есть запись 'голова': 'head'
1
2
3
4
5
6
7
8
9
10

Расширяя словарь, имейте в виду, что из нескольких пар с одинаковыми ключами Python видит только одну — ту, что записана или добавлена последней:

my_wife = {'жена': 'Оля', 'жена': 'Варя', 'жена': 'Вера Трифоновна'}
print(my_wife)      # {'жена': 'Вера Трифоновна'}
1
2

Упражнения

  1. Добавьте в словарь friends ещё две пары ключ-значение, просто дописав их в объявление словаря. Имена друзей и города, в которых они живут, придумайте сами.
friends =  {'Серёга': 'Омск', 'Соня': 'Москва', 'Дима': 'Челябинск'}
1
  1. После этого напечатайте на экран сообщение "Вот в каких городах живут мои друзья: " и затем названия всех городов словаря, разделённые запятой с пробелом.

Перебор элементов словаря

Пройти по всем элементам словаря можно циклом for, причем есть несколько вариантов:

favorite_songs = {
    'Тополиный пух': 'Иванушки international',
    'Город золотой': 'Аквариум',
    'Звезда по имени Солнце': 'Кино'
}

for track in favorite_songs:
    print(track + ' это песня группы ' + favorite_songs[track])
1
2
3
4
5
6
7
8

Этот способ позволяет пробежать по всем ключам словаря. Обратите внимание, что track здесь — просто название переменной, оно могло быть любым и код отработал бы также. Еще можно пройти отдельно по значениям словаря:

for music_band in favorite_songs.values():
    print('Доктор, я больше не могу слушать группу ' + music_band)
1
2

И по ключам и значениям одновременно:

for track, music_band in favorite_songs.items():
    print(track + ' это песня группы ' + music_band)
1
2

Здесь мы вызвали метод items() — он похож на keys() и values(), но возвращает набор пар ключ-значение, поэтому при переборе мы используем две переменных - track и music_band. Вы можете называть их и по-другому, хоть например song и band.

Упражнения

  1. Напечатайте о каждом из друзей такое сообщение "<имя друга> живёт в городе <название города>".
friends =  {'Серёга': 'Омск', 'Соня': 'Москва', 'Дима': 'Челябинск', 'Соняz': 'Москваz', 'Димаz': 'Челябинскz'}
1
  1. В этой задаче вам дан словарь, в котором ключи - имена друзей, а значения - списки любимых песен каждого друга. Напечатайте на экран:
  • Количество любимых песен Димы
  • Все любимые песни Сони через запятую и пробел
favorite_songs = {
    'Серёга': ["Unforgiven", "Holiday", "Highway to hell"],
    'Соня': ["Shake it out", "Don't stop me now", "Наше лето"],
    'Дима': ["Владимирский централ", "Мурка", "Третье сентября"]
}

# напишите код, который напечатает на экран, сколько у Димы любимых песен
...
# здесь напишите код, который напечатает все любимые песни Сони через запятую
...
1
2
3
4
5
6
7
8
9
10
  1. Научите Виту собирать словарь friends с нуля. Вам дано два списка: friends_names, имена друзей, и friends_cities — их города. Списки соответствуют друг другу: friends_names[0] живёт в городе friends_cities[0].

Напечатайте на экран сообщение "Лена живёт в городе <город>", используя доступ по ключу в словаре friends.

friends_names = ['Аня', 'Коля', 'Лёша', 'Лена', 'Миша']
friends_cities = ['Владивосток', 'Красноярск', 'Москва', 'Обнинск', 'Чебоксары']

friends = {}

# допишите ваш код сюда
1
2
3
4
5
6