Словари
Чему вы научитесь:
- читать, добавлять и менять пары словаря по ключу;
- читать отсутствующий ключ без ошибки с помощью
get; - считать, сколько раз встречается каждое слово;
- убирать повторы и сравнивать наборы с помощью множеств.

Представьте фруктовый прилавок, над которым висит табличка с ценами. В каждой строке слева название фрукта, справа цена: в строке pear стоит 70.
Чтобы узнать цену груши, продавец не пересчитывает строки. Он находит строку по названию и читает цену рядом с ним.
Теперь попробуйте хранить те же цены в двух списках: в одном названия, в другом цены. Чтобы узнать цену груши, придётся найти номер "pear" в первом списке и взять элемент с тем же номером из второго. К тому же списки расходятся: название из одного удалили, а цену из другого забыли.
Словарь хранит пары, как строки таблички: по ключу сразу находится значение. Ключ — это название в строке, значение — цена рядом с ним:
prices = {"pear": 70, "plum": 40}
print(prices["pear"]) # 70
prices["kiwi"] = 90
prices["plum"] = 45
print(prices) # {'pear': 70, 'plum': 45, 'kiwi': 90}
print(len(prices)) # 3Давайте разберём пример по строкам:
prices = {"pear": 70, "plum": 40}создаёт словарь из двух пар.prices["pear"]находит пару с ключом"pear"и даёт70.prices["kiwi"] = 90добавляет на табличку новую строку: ключа"kiwi"ещё не было.prices["plum"] = 45не добавляет строку, а меняет цену сливы.print(prices)показывает все три пары, аlen(prices)возвращает их число —3.
Чтение и запись
Словарь в коде записывают в фигурных скобках: пары «ключ: значение» через запятую. Значение читают по ключу в квадратных скобках, как элемент списка по индексу. Запись по ключу работает в двух вариантах:
- запись по новому ключу добавляет пару;
- запись по существующему ключу заменяет её значение.
Поэтому каждый ключ встречается в словаре один раз, а len возвращает число пар. Здесь аналогия с табличкой перестаёт работать. На настоящей табличке можно дважды написать pear с разными ценами, а в словаре вторая запись заменит первую.
Чтение по ключу не перебирает пары по одной, как цикл по списку. Поэтому его скорость почти не зависит от размера словаря. В словаре из миллиона пар цена груши находится так же быстро, как в словаре из двух.
Что ещё нужно знать о словаре:
- значением может быть что угодно: число, строка, список;
- пустой словарь записывают как
{}; - инструкция
del prices["kiwi"]удаляет пару вместе с ключом; - оператор
inпроверяет ключи, а не значения:"pear" in pricesдаётTrue, а70 in prices—False.
Два имени, один словарь
Как и список, словарь при b = a не копируется: оба имени ведут к одной и той же табличке. Запись через b видна и через a.
Отдельную копию с теми же парами дают два способа:
dict(prices)строит новый словарь из пар старого;prices.copy()делает то же самое методом словаря.
Метод get
Чтение отсутствующего ключа в квадратных скобках останавливает программу ошибкой. Это как спросить у продавца цену киви, которого на табличке нет. Метод get читает без ошибки: для отсутствующего ключа он возвращает None или второй аргумент, если тот передан.
stock = {"apple": 3, "pear": 0}
print(stock.get("plum")) # None
print(stock.get("plum", 10)) # 10
print(stock.get("pear", 10)) # 0
print("plum" in stock) # FalseРазберём по строкам:
stock.get("plum")даётNone: ключа"plum"нет, а второго аргумента не передали.stock.get("plum", 10)даёт10: ключа по-прежнему нет, иgetвозвращает второй аргумент.stock.get("pear", 10)даёт0: ключ"pear"есть, иgetвозвращает его значение, хотя оно и ложное."plum" in stockдаётFalse: сам словарьgetне меняет, и ключ"plum"в нём не появился.
Второй аргумент используется, только когда ключа нет. Передавайте в нём то, что означает отсутствие: 0 для остатка на складе или пустую строку для имени.
Этот вопрос часто задают на собеседовании: «Чем d[k] отличается от d.get(k)?» Ответ:
d[k]для отсутствующего ключа вызывает ошибкуKeyError;d.get(k)возвращаетNone, аd.get(k, x)—x;- ни один из них не добавляет ключ в словарь.
Частая ошибка
Ключ читают в квадратных скобках, не проверив, что он есть:
stock = {"apple": 3, "pear": 0}
print(stock["plum"]) # ✗KeyError: 'plum'Ошибка KeyError называет ключ, которого нет в словаре. Если отсутствующий ключ — обычный случай, читайте значение через get или сначала проверьте "plum" in stock в if. Например, stock.get("plum", 0) даёт 0, и программа продолжает работу.
Главное
- Словарь хранит пары «ключ — значение»:
d[k]читает значение, аd[k] = vдобавляет пару или заменяет значение. - Каждый ключ встречается в словаре один раз, а
inпроверяет ключи. b = aдаёт второе имя тому же словарю, а копию даютdict(a)иa.copy().d.get(k, x)возвращаетxвместо ошибкиKeyError, если ключа нет.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.