Перейти к содержанию
Educora
Средний16 мин8 / 42

Словари

Храни данные парами «ключ: значение»: создавай словарь, изменяй его, перебирай в цикле и используй для подсчёта.

Проверь себя
В этом уроке ты узнаешь
  • Создавать словарь и получать значения по ключам
  • Добавлять, изменять и удалять пары, безопасно читать через get()
  • Перебирать словарь через items() и подсчитывать с его помощью частоты

Вспомни контакты в телефоне: ищешь «Мама» и сразу видишь номер — не нужно знать, каким по счёту идёт этот контакт. Так же устроен обычный словарь: находишь слово, а рядом написано его значение. В Python такие данные хранят в словаре (dict): у каждого значения есть свой ключ.

Создание словаря

Определение
Словарь (dict)

Набор пар ключ: значение в фигурных скобках {}. Значение находят не по индексу, а по ключу: student['name'].

Python
student = {'name': 'Leyla', 'age': 14, 'city': 'Ganja'}
print(student)
print(student['name'])
print(len(student))
print(student.get('email'))
print(student.get('email', 'no email'))
▸ Ожидаемый результат
{'name': 'Leyla', 'age': 14, 'city': 'Ganja'}
Leyla
3
None
no email

Если прочитать ключ, которого нет в словаре, например student['email'], Python выдаст ошибку KeyError. Метод get() ошибки не вызывает: если ключа нет, он вернёт None (особое значение Python, означающее «ничего») или то, что ты передашь вторым аргументом.

Изменение словаря

Добавление новой пары и изменение существующего значения записываются одинаково: student['age'] = 15. Если ключ есть, значение обновится; если нет — появится новая пара. del удаляет пару, а in проверяет, есть ли ключ в словаре.

Python
student = {'name': 'Leyla', 'age': 14}
student['age'] = 15
student['grade'] = 9
print(student)

del student['grade']
print('grade' in student, 'name' in student)
▸ Ожидаемый результат
{'name': 'Leyla', 'age': 15, 'grade': 9}
False True

Перебор словаря

keys() возвращает все ключи, values() — все значения, а items() — пары (ключ, значение). В цикле по items() каждую пару можно сразу распаковать в две переменные — как в уроке о кортежах.

Python
prices = {'bread': 0.8, 'milk': 1.9, 'cheese': 6.5}
for item, price in prices.items():
    print(f'{item}: {price:.2f} AZN')

print('Items:', list(prices.keys()))
print(f'Total: {sum(prices.values()):.2f} AZN')
▸ Ожидаемый результат
bread: 0.80 AZN
milk: 1.90 AZN
cheese: 6.50 AZN
Items: ['bread', 'milk', 'cheese']
Total: 9.20 AZN
1 / 6

Подсчёт с помощью словаря

Одно из самых полезных применений словаря — подсчёт, сколько раз что-то встречается. Для каждого слова пишем counts.get(word, 0) + 1: когда слово встречается впервые, get возвращает 0, а дальше к старому счёту прибавляется 1.

Python
text = 'the cat and the dog and the bird'
counts = {}
for word in text.split():
    counts[word] = counts.get(word, 0) + 1
print(counts)
print('the:', counts['the'])
▸ Ожидаемый результат
{'the': 3, 'cat': 1, 'and': 2, 'dog': 1, 'bird': 1}
the: 3

Вложенные структуры

Значение в словаре может быть любого типа — например, списком. Так можно сделать электронный журнал: ключ — имя ученика, а значение — список его оценок.

Python
journal = {
    'Aysel': [5, 4, 5],
    'Murad': [4, 3, 4],
    'Nigar': [5, 5, 5],
}
for name, grades in journal.items():
    avg = sum(grades) / len(grades)
    print(f'{name}: {avg:.1f}')

journal['Murad'].append(5)
print(journal['Murad'])
▸ Ожидаемый результат
Aysel: 4.7
Murad: 3.7
Nigar: 5.0
[4, 3, 4, 5]

Словарь особенно удобен для таких задач:

  • быстрый поиск значения по имени или коду: контакты, цены товаров;
  • подсчёт: частота слов, голосов, оценок;
  • группировка: для каждого класса — свой список учеников;
  • описание свойств одного объекта: имя, возраст, город.
Python
import json

student = {'name': 'Leyla', 'age': 14, 'city': 'Ganja'}
text = json.dumps(student)
print(text)

back = json.loads(text)
print(back['city'])
▸ Ожидаемый результат
{"name": "Leyla", "age": 14, "city": "Ganja"}
Ganja
Задание

Добавь в словарь prices ключ 'tea' с ценой 3.2 и измени цену 'bread' на 1.0. Затем с помощью .items() выведи каждый товар в виде apple: 1.50, а в конце — Total: и сумму всех цен (с двумя знаками после точки).

Задание · Python
prices = {'apple': 1.5, 'bread': 0.8, 'milk': 1.9}
# 1) add tea for 3.2 and change bread to 1.0
# 2) print each item like: apple: 1.50
# 3) print Total: and the sum of all prices
▸ Ожидаемый результат
apple: 1.50
bread: 1.00
milk: 1.90
tea: 3.20
Total: 7.60
Задание

Класс голосовал за любимое блюдо. Посчитай голоса за каждое блюдо с помощью словаря и .get(), затем выведи блюда в алфавитном порядке в виде dolma: 2. В конце выведи Winner: и название блюда, набравшего больше всего голосов.

Задание · Python
votes = ['plov', 'dolma', 'plov', 'kebab', 'dolma', 'plov']
counts = {}
# 1) count the votes for each dish
# 2) print the dishes in alphabetical order like: dolma: 2
# 3) print Winner: and the dish with the most votes
▸ Ожидаемый результат
dolma: 2
kebab: 1
plov: 3
Winner: plov

Главное

  • Словарь — это пары ключ: значение в {}; значение находят по ключу.
  • d[key] = value добавляет пару или обновляет значение, del d[key] удаляет пару.
  • get() не падает на отсутствующем ключе, а возвращает None или заданное значение по умолчанию.
  • Цикл по items() на каждом шаге даёт ключ и значение вместе.
  • Ключи должны быть уникальными и неизменяемого типа.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Если d = {'a': 1, 'b': 2}, чему равно d['b']?