Статья

Словари в Python

Python предоставляет составной тип данных, называемый словарем (dict). Словари – это реализация структуры данных в Python, которая более широко известна как ассоциативный массив. Словарь состоит из набора пар ключ-значение. Каждая пара ключ-значение сопоставляет ключ с соответствующим значением.

Вы можете определить словарь, заключив разделенный запятыми список пар ключ-значение в фигурные скобки {}. Двоеточие : отделяет каждый ключ от связанного с ним значения:
names_and_ages = {
    'Ivan': 24,
    'Elen': 21,
    'Oleg': 18
}
Вы также можете создать словарь с помощью встроенной функции dict(). Аргументом для dict() должна быть последовательность пар ключ-значение. Список кортежей хорошо подходит для этого:
names_and_ages = dict([
    ('Ivan', 24),
    ('Elen', 21),
    ('Oleg', 18)
])
Еще один способ определить словарь, в случае, если ключи представляют собой простые строки:
names_and_ages = dict(
    Ivan=24,
    Elen=21,
    Oleg=18
)

Доступ к значениям словаря

Значения словаря должны быть каким-то образом доступны. Но, мы не можем получить их по индексам, как в списках. Как тогда получить доступ к значениям, которые хранятся в словарях? Значение извлекается из словаря путем указания соответствующего ключа в квадратных скобках []. Если вы ссылаетесь на ключ, которого нет в словаре, Python вызывает исключение:
>>> names_and_ages = dict(Ivan=24, Elen=21, Oleg=18)
>>> names_and_ages
{'Ivan': 24, 'Elen': 21, 'Oleg': 18}

>>> names_and_ages['Elen']
21
>>> names_and_ages['Oleg']
18
>>> names_and_ages['Svetlana']
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    names_and_ages['Svetlana']
KeyError: 'Svetlana'
Пример добавления нового элемента в словарь:
>>> names_and_ages['Svetlana'] = 19
>>> names_and_ages
{'Ivan': 24, 'Elen': 21, 'Oleg': 18, 'Svetlana': 19}
Пример обновления значения элемента в словаре:
>>> names_and_ages['Oleg'] = 30
>>> names_and_ages
{'Ivan': 24, 'Elen': 21, 'Oleg': 30, 'Svetlana': 19}
Пример удаления элемента из словаря:
del names_and_ages['Oleg']
>>> names_and_ages
{'Ivan': 24, 'Elen': 21, 'Svetlana': 19}

Методы словарей

Как и в случае со строками и списками, существует несколько встроенных методов, которые могут быть вызваны в словарях.

clear()

Метод очищает словарь от всех пар ключ-значение
>>> langs = {'Питон': '3.8', 'Сишарп': '10'}
>>> langs
{'Питон': '3.8', 'Сишарп': '10'}

>>> langs.clear()
>>> langs
{}

get([, ])

Метод get() предоставляет удобный способ получения значения ключа из словаря без предварительной проверки, существует ли ключ, и без возникновения ошибки. d.get(<key>) выполняет поиск <key> в словаре d и возвращает соответствующее значение, если оно найдено. Если <key> не найден, он возвращает None:
>>> d = {'Пайтон': 3.8, 'Сишарп': 10, 'С++': 11}

>>> print(d.get('Пайтон'))
3.8
>>> print(d.get('Java'))
None
Если ключ не найден и указан аргумент по умолчанию, то это значение возвращается вместо None:
>>> d = {'Пайтон': 3.8, 'Сишарп': 10, 'С++': 11}

>>> print(d.get('Java', -1))
-1

items()

d.items() возвращает список кортежей, содержащих пары ключ-значение в словаре d. Первый элемент в каждом кортеже – это ключ, а второй элемент – значение ключа:
>>> d = {'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}
>>> d
{'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}

>>> list(d.items())
[('Питон', 10), ('Паскаль', 20), ('Бейсик', 30)]
>>> list(d.items())[1][0]
'Паскаль'
>>> list(d.items())[1][1]
20

keys()

Возвращает список ключей в словаре
>>> d = {'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}
>>> d
{'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}

>>> list(d.keys())
['Питон', 'Паскаль', 'Бейсик']

values()

Возвращает список значений в словаре
>>> d = {'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}
>>> d
{'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}

>>> list(d.values())
[10, 20, 30]

pop()

Удаляет ключ из словаря, если он присутствует, и возвращает его значение. Метод d.pop(<ключ>) вызывает исключение KeyError, если <ключ> отсутствует в d:
>>> d = {'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}
>>> d
{'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}

>>> d.pop('Питон')
10
>>> d
{'Паскаль': 20, 'Бейсик': 30}

>>> d.pop('Котлин')
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    d.pop('Котлин')
KeyError: 'Котлин'

popitem()

d.popitem() удаляет последнюю пару ключ-значение, добавленную в d, и возвращает ее в виде кортежа. Если d пуст, d.popitem() вызывает исключение KeyError:
>>> d = {'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}
>>> d
{'Питон': 10, 'Паскаль': 20, 'Бейсик': 30}

>>> d.popitem()
('Бейсик': 30)
>>> d
{'Питон': 10, 'Паскаль': 20}

>>> de = {}
>>> de.popitem()
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    de.popitem()
KeyError: 'popitem(): dictionary is empty'

update(obj)

Объединяет словарь с другим словарем или с итератором пар ключ-значение.
Если параметр <obj> является словарем, d.update(<obj>) объединяет записи из <obj> в d.
И для каждого ключа в <obj>
  • Если ключ отсутствует в d, пара ключ-значение из <obj> добавляется в d.
  • Если ключ уже присутствует в d, соответствующее значение в d для этого ключа обновляется до значения из <obj>.
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict2 = {'b': 20, 'd': 40}

>>> dict1.update(dict2)
>>> dict1
{'a': 1, 'b': 20, 'c': 3, 'd': 40}

Заключение

В этой статье мы рассмотрели основные свойства словарей в Python и узнали, как получать доступ к данным словарей и манипулировать ими.
Списки и словари – это два наиболее часто используемых типа Python. Как вы видели, они имеют несколько общих черт, но отличаются тем, как осуществляется доступ к их элементам. Доступ к элементам списков осуществляется по числовому индексу, а к элементам словаря – по ключу.
Из-за этих различий списки и словари, как правило, подходят для разных случаев.
python