Словари (dict) – неупорядоченные наборы произвольных объектов с доступом по ключу. Их иногда ещё называют ассоциативными массивами или хеш-таблицами.
Самый простой:
my_dict = {}
С помощью конструктора класса:
my_dict = dict()
Если заранее известны ключи:
my_dict = dict.fromkeys(['key1', 'key2', 'key3'])
default_value = 0
my_list = dict.fromkeys(['key1', 'key2', 'key3'], default_value)
На базе существующих ключей и значений:
my_dict = {'key1':'value1', 'key2':'value2', 'key3':'value3'}
# Если ключи являются корректными идентификаторами:
my_dict = dict(key1='value1', key2='value2', key3='value3')
my_dict = dict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])
# Если ключи и значения хранятся в списках:
keys = ['key1', 'key2', 'key3']
values = ['value1', 'value2', 'value3']
my_dict = dict(zip(keys, values))
На базе существующего словаря:
my_dict = existing_dict.copy() # поверхностная копия
from copy import deepcopy
my_dict = deepcopy(existing_dict) # глубокое копирование
С помощью объединения нескольких словарей:
my_dict = {**dict1, **dict2}
my_dict = dict1 | dict2 # начиная с Python 3.9
Генераторные выражения:
my_dict = {key: key**2 for key in range(10)}
my_dict = {k1 + k2: ' ' for k1 in 'ABCDEFGH' for k2 in '123456789'}
my_dict = {key: key**2 for key in range(10) if key % 2 == 0}
По умолчанию обход словаря происходит по ключам:
for key in my_dict:
print(key, my_dict[key])
Также можно использовать функции:
.keys() — список ключей. Например:
for key in my_dict.keys():
print(key, my_dict[key])
.values() — список значений. Например:
for value in my_dict.values():
print(value)
.items() — список пар ключ/значение. Например:
for key, value in my_dict.items():
print(key, value)
Количество элементов в словаре:
print('This dict has:', len(my_dict), 'elements')
Удаление значения из словаря по ключу:
del my_dict[key]
Получение ключей из словаря:
list(my_dict)
my_dict.keys()
Проверка что ключ входит или не входит в словарь (см. PEP8):
if 'key' in my_dict:
print('belongs')
# Рекомендуемый вариант
if 'key' not in my_dict:
print('not belongs')
# Нерекомендуемый вариант
if not 'key' in my_dict:
print('not belongs')
Проверка содержимого двух словарей на равенство или неравенство:
if my_dict == other_dict:
print('these two dicts have equal content')
if my_dict != other_dict:
print('these two dicts have different content')
Проверка двух словарей на идентичность (см. PEP8):
if dict1 is dict2:
print('these two variables are the same object!')
# Рекомендуемый вариант
if dict1 is not dict2:
print('different objects')
# Нерекомендуемый вариант
if not dict1 is dict2:
print('different objects')
Если функция hash() работает со значением, то это значение может быть ключом словаря.
Ключом словаря могут быть значения типа:
bool)int)float)complex)str)bytes)tuple)frozenset)
my_dict = {}
for i in range(3):
for j in range(5):
my_dict[i, j] = 0 # Кортеж в качестве ключа
Ключом словаря НЕ могут быть значения типа:
list)dict)set)bytearray)Удаление всех ключей и значений словаря:
my_dict.clear()
Прочитать значения по ключу:
print(my_dict[key]) # если key не входит в my_dict, тогда ошибка KeyError
print(my_dict.get(key)) # если key не входит в my_dict, тогда None
print(my_dict.get(key, 0)) # если key не входит в my_dict, тогда 0
Установить значение по ключу, если этого ключа нет:
my_dict[key] = value # если было старое значение - оно будет перезаписано
# если значение уже есть - возвращаем его
# иначе - записываем значение и возвращаем его
my_dict.setdefault(key, value)
Установить пустое значение, если этого ключа нет:
my_dict.setdefault(key) # если значение уже есть - возвращаем его
Извлечение значения по ключу:
value = my_dict.pop(key) # ключ и значение удаляются из my_dict
Извлечение ключа и значения, которые были добавлены последними:
key, value = my_dict.popitem() # ключ и значение удаляются из my_dict
Обновление словаря элементами из другого словаря:
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'b': 4}
dict1.update(dict2)
dict1 |= dict2 # начиная с Python 3.9
print(dict1) # {'a': 1, 'b': 4, 'c': 3}