Словарь (dict) - неупорядоченная изменяемая структура данных, которая позволяет хранить пары “ключ - значение”. Ключи должны быть уникальны. Ключ чаще всего является строкой, но может быть любым из неизменяемых типов: boolean, int, float, tuple, str и т.д.
Еще их называют ассоциативными массивами, хэшами, хэш-таблицами.
Создание словаря
Составные ключи (кортежи в качестве ключей)
Добавление элементов
Получение элемента словаря
dict() - преобразование в словарь
Методы словарей
.keys(), .values() и .items()
.keys() возвращает все ключи словаря:
.values() возвращает все значения словаря:
.items() возвращает все пары “ключ - значение” словаря:
.update()
.update() позволяет обновить несколько пар сразу. Метод принимает другой словарь в качестве аргумента:
Данные в словарь добавятся не в том порядке, в котором были добавлены, ибо словарь неупорядоченная структура данных.
.pop(), .clear() и оператор del
.pop()удаляет ключ и возвращает его значение:
Key "rename"
С помощью .pop() можно также переименовать ключ в словаре:
По сути, ключ 'd' удалился, а его значение сразу передалось новому ключу 'D'.
А если возвращать значение не требуется - можно использовать оператор del:
Если нужно удалить все элементы словаря:
Если нужно удалить сам словарь:
Объединение словарей с помощью конструкции {**a, **b}
В Python 3.5 и выше есть новый способ объединять словари с помощью
конструкции ** :
Это не полные копии
Эти копии являются поверхностными. Если нужны полные копии →deepcopy()
Присваивание значения с помощью оператора =
Как и в случае со списками, если внести в словарь изменение, оно отразится на всех именах, которые на него ссылаются:
Сравнение словарей
Операторы, кроме != и == работать не будут:
Python сравнивает ключи и значения по одному. Порядок, в котором они создава-
лись, не имеет значения. В этом примере словари a и b равны, за исключением того,
что по ключу 1 в словаре а находится список [1, 2], а в словаре b - список [1, 1].
Вложенные словари
Как создать такую структуру данных (словарь с вложенными в него другими словарями):
Можно так:
Обращение к вложенным элементам
Принцип такой же, как и с вложенными списками:
Можно так же изменять вложенные данные:
Пример с .get():
Дефолтное значение нужно задать пустым словарем{}, чтобы не было ошибки из-за поиска значений в None, если например первый .get() не найдет ничего.
Коллекция defaultdict из модуля collections - это подкласс словаря, который автоматические создает дефолтное значение для отсутствующих ключей.
То есть, теперь нет нужды проверять словарь на наличие какого-то ключа и самому задавать через метод get дефолтное значение для ключей, которых в словаре нет. Обращаясь к несуществующему ключу не получишь KeyError.
Наглядно:
Pretty print nested dictionaries (с отступами)
Алгоритмическая сложность методов словаря
Вставка элемента (dict[key] = value)
средний случай: $O(1)$
худший случай: $O(n)$, где n - кол-во элементов в словаре
В худшем случае может возникнуть необходимость в перехешировании словаря.
Получение значения по ключу (dict[key])
средний случай: $O(1)$
худший случай: $O(n)$
В худшем случае может возникнуть коллизия хешей, требующая прохода по цепочке элементов с одинаковыми хешами.
Удаление элемента по ключу (del dict[key])
средний случай: $O(1)$
худший случай: $O(n)$
В худшем случае может потребоваться удаление и перехеширование элементов.
Проверка наличия ключа (key in dict)
средний случай: $O(1)$
худший случай: $O(n)$
В худшем случае может понадобиться проверка всех элементов.
Соус: Книга “Простой Python” → Глава 8. “Словари и множества”