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