Словари
До сих пор вы хранили данные в списках. Например, есть список друзей пользователя. А список английских слов, которые кто-то из этих друзей хочет выучить, мог бы выглядеть так:
english_words = ['hand', 'leg', 'back-end developer']
Гораздо удобнее было бы хранить переводы слов с русского на английский, чтобы забытые слова было легко подсмотреть. Для этого в Python есть структура данных dict
(от англ. dictionary, «словарь»). Вот как она выглядит:
english = {
'рука': 'hand',
'нога': 'leg',
'бэкенд-разработчик': 'back-end developer'
}
2
3
4
5
Словарь оформляется фигурными скобками. Его заполняют пары, записанные через запятую. Первый элемент в паре называется ключ, а второй — значение, они разделяются между собой двоеточием. Русские слова здесь ключи, а их переводы на английский — значения. Когда запрашивают в словаре значение, соответствующее определённому ключу, это называется «доступ по ключу». Так можно получить значение для какого-нибудь ключа и заменить его:
english = {
'рука': 'hand',
'нога': 'leg',
'бэкенд-разработчик': 'back-end developer'
}
# доступ по ключу: как по-английски рука?
print(english['рука']) # будет напечатано слово hand
english['рука'] = 'arm'
# значение для ключа 'рука' поменялось с 'hand' на 'arm' - другой допустимый перевод
2
3
4
5
6
7
8
9
10
11
Ключи в словаре похожи на индексы списков. Только индексами выступают натуральные числа, а ключами бывают и числа обоих типов, и строки, и даже булевы значения True
и False
:
garden = {
'земляника': 'ягода',
'яблоко': 'фрукт',
'лук': ['овощ', 'оружие'] # значением может быть список
}
print(garden['лук'])
# будет напечатано ['овощ', 'оружие']
garden = {
'земляника': 'ягода',
'яблоко': 'фрукт',
['морковь', 'кабачок']: 'овощ' # а так нельзя! ключом список быть не может
}
print(garden[['морковь', 'кабачок']]) # получится ошибка
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(['Ѣ', 'Ѧ', 'Ѫ'])
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Чтобы такие списки использовать в коде, их обычно превращают в строки методом join()
:
# словарь отчеств
patronymic = {'Илья': 'Ильич', 'Иван': 'Ивановна', 'Пётр': 'Петровна'}
print(", ".join(patronymic.values()))
# выводится строка: Ильич, Ивановна, Петровна
2
3
4
- Научим Виту хранить в словаре записи о друзьях и получать к ним доступ по ключу. Напечатайте на экран город, в котором живет Серёга.
{'Серёга': 'Омск', 'Соня': 'Москва', 'Дима': 'Челябинск'}
- Серёга переехал в Оренбург. Получив по ключу доступ к записи о его городе, отразите этот факт в словаре.
Расширение словаря
Добавим слов в наш небольшой русско-английский словарь:
english = {
'рука': 'hand',
'нога': 'leg',
'бэкенд-разработчик': 'back-end developer'
}
2
3
4
5
Сделать это можно несколькими способами:
# просто дописать новую пару в объявление словаря
english = {
'рука': 'hand',
'нога': 'leg',
'бэкенд-разработчик': 'back-end developer',
'запрос': 'request' # новая пара ключ-значение
}
# использовать доступ по ключу
english['голова'] = 'head' # теперь в словаре есть запись 'голова': 'head'
2
3
4
5
6
7
8
9
10
Расширяя словарь, имейте в виду, что из нескольких пар с одинаковыми ключами Python видит только одну — ту, что записана или добавлена последней:
my_wife = {'жена': 'Оля', 'жена': 'Варя', 'жена': 'Вера Трифоновна'}
print(my_wife) # {'жена': 'Вера Трифоновна'}
2
Упражнения
- Добавьте в словарь friends ещё две пары ключ-значение, просто дописав их в объявление словаря. Имена друзей и города, в которых они живут, придумайте сами.
friends = {'Серёга': 'Омск', 'Соня': 'Москва', 'Дима': 'Челябинск'}
- После этого напечатайте на экран сообщение "Вот в каких городах живут мои друзья: " и затем названия всех городов словаря, разделённые запятой с пробелом.
Перебор элементов словаря
Пройти по всем элементам словаря можно циклом for
, причем есть несколько вариантов:
favorite_songs = {
'Тополиный пух': 'Иванушки international',
'Город золотой': 'Аквариум',
'Звезда по имени Солнце': 'Кино'
}
for track in favorite_songs:
print(track + ' это песня группы ' + favorite_songs[track])
2
3
4
5
6
7
8
Этот способ позволяет пробежать по всем ключам словаря. Обратите внимание, что track здесь — просто название переменной, оно могло быть любым и код отработал бы также. Еще можно пройти отдельно по значениям словаря:
for music_band in favorite_songs.values():
print('Доктор, я больше не могу слушать группу ' + music_band)
2
И по ключам и значениям одновременно:
for track, music_band in favorite_songs.items():
print(track + ' это песня группы ' + music_band)
2
Здесь мы вызвали метод items()
— он похож на keys()
и values()
, но возвращает набор пар ключ-значение, поэтому при переборе мы используем две переменных - track
и music_band
. Вы можете называть их и по-другому, хоть например song
и band
.
Упражнения
- Напечатайте о каждом из друзей такое сообщение "<имя друга> живёт в городе <название города>".
friends = {'Серёга': 'Омск', 'Соня': 'Москва', 'Дима': 'Челябинск', 'Соняz': 'Москваz', 'Димаz': 'Челябинскz'}
- В этой задаче вам дан словарь, в котором ключи - имена друзей, а значения - списки любимых песен каждого друга. Напечатайте на экран:
- Количество любимых песен Димы
- Все любимые песни Сони через запятую и пробел
favorite_songs = {
'Серёга': ["Unforgiven", "Holiday", "Highway to hell"],
'Соня': ["Shake it out", "Don't stop me now", "Наше лето"],
'Дима': ["Владимирский централ", "Мурка", "Третье сентября"]
}
# напишите код, который напечатает на экран, сколько у Димы любимых песен
...
# здесь напишите код, который напечатает все любимые песни Сони через запятую
...
2
3
4
5
6
7
8
9
10
- Научите Виту собирать словарь
friends
с нуля. Вам дано два списка:friends_names
, имена друзей, иfriends_cities
— их города. Списки соответствуют друг другу:friends_names[0]
живёт в городеfriends_cities[0]
.
Напечатайте на экран сообщение "Лена живёт в городе <город>"
, используя доступ по ключу в словаре friends
.
friends_names = ['Аня', 'Коля', 'Лёша', 'Лена', 'Миша']
friends_cities = ['Владивосток', 'Красноярск', 'Москва', 'Обнинск', 'Чебоксары']
friends = {}
# допишите ваш код сюда
2
3
4
5
6