Словарь (dict) - неупорядоченная изменяемая структура данных, которая позволяет хранить пары “ключ - значение”. Ключи должны быть уникальны. Ключ чаще всего является строкой, но может быть любым из неизменяемых типов: boolean, int, float, tuple, str и т.д.
Еще их называют ассоциативными массивами, хэшами, хэш-таблицами.
Эти копии являются поверхностными. Если нужны полные копии →deepcopy()
Присваивание значения с помощью оператора =
Как и в случае со списками, если внести в словарь изменение, оно отразится на всех именах, которые на него ссылаются:
>>> signals = {'green': 'go', 'yellow': 'go faster', 'red': 'smile for the camera'}>>> save_signals = signals>>> signals['blue'] = 'confuse everyone'>>> save_signals{'green': 'go','yellow': 'go faster','red': 'smile for the camera','blue': 'confuse everyone'}
Сравнение словарей
>>> a = {1:1, 2:2, 3:3}>>> b = {3:3, 1:1, 2:2}>>> a == bTrue
Операторы, кроме != и == работать не будут:
>>> a = {1:1, 2:2, 3:3}>>> b = {3:3, 1:1, 2:2}>>> a <= bTraceback (most recent call last): File "<input>", line 1, in <module> a <= bTypeError: '<=' not supported between instances of 'dict' and 'dict'
Python сравнивает ключи и значения по одному. Порядок, в котором они создава-
лись, не имеет значения. В этом примере словари a и b равны, за исключением того,
что по ключу 1 в словаре а находится список [1, 2], а в словаре b - список [1, 1].
>>> a = {1: [1, 2], 2: [1], 3:[1]}>>> b = {1: [1, 1], 2: [1], 3:[1]}>>> a == bFalse
Вложенные словари
Как создать такую структуру данных (словарь с вложенными в него другими словарями):
Дефолтное значение нужно задать пустым словарем{}, чтобы не было ошибки из-за поиска значений в None, если например первый .get() не найдет ничего.
Генерация словарей (dict comprehensions)
Синтаксис
{выражение для ключа : выражение для значения for выражение in итерабельный объект}{выражение для ключа : выражение для значения for выражение in итерабельныйобъект if условие}# Пример с zip(){key: value for key, value in zip(keys, values)}
Примеры
>>> word = 'letters'>>> letter_counts = {letter: word.count(letter) for letter in word}>>> letter_counts{'l': 1, 'e': 2, 't': 2, 'r': 1, 's': 1}>>> letter_counts = {letter: word.count(letter) for letter in set(word)}>>> letter_counts{'t': 2, 'l': 1, 'e': 2, 'r': 1, 's': 1}# С условием:>>> vowels = 'aeiou'>>> word = 'onomatopoeia'>>> vowel_counts = {letter: word.count(letter) for letter in set(word) if letter in vowels}>>> vowel_counts{'e': 1, 'i': 1, 'o': 4, 'a': 2}
Коллекция defaultdict из модуля collections - это подкласс словаря, который автоматические создает дефолтное значение для отсутствующих ключей.
То есть, теперь нет нужды проверять словарь на наличие какого-то ключа и самому задавать через метод get дефолтное значение для ключей, которых в словаре нет. Обращаясь к несуществующему ключу не получишь KeyError.
Наглядно:
from collections import defaultdictstudent_scores = defaultdict(int)# int - это если хочешь получать 0 по дефолтуstudent_scores['Alice'] = 85student_scores['Bob'] = 90student_scores['Charlie'] = 95print(student_scores['Tigranes the Great'])# 0