Словари — один из самых мощных типов данных Python. В других языках программирования и информатике в целом их еще называют ассоциативными массивам. Словари позволяют связывать ключи со значениями.

Создание словаря

Давайте попробуем создать и использовать словарь в интерактивном интерпретаторе Python (Python REPL).

>>> phone_nrs = { 'Jack': '070-02222748', 'Pete': '010-2488634' }
>>> an_empty_dict = { }
>>> phone_nrs['Jack']
'070-02222748'

Первый словарь phone_nrs связывает ключи (строки ‘Jack’ и ‘Pete’) со значениями (номерами телефонов Джека и Пита соответственно). Второй словарь an_empty_dict — пустой.

Теперь, когда вы увидели, как инициализировать словарь, давайте посмотрим, как добавлять и удалять записи в уже существующем словаре.

>>> phone_nrs ['Eric'] = '06-10101010 '
>>> del (phone_numbers ['Jack'])
>>> phone_nrs
{'Pete':'010-2488634','Eric': '06-10101010'}

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

В словарь можно положить что угодно, вы не ограничены типами данными. В словарь можно поместить даже другой словарь или список и при этом спокойно получать доступ к «вложенным значениям», используя несколько квадратных скобок ([][]).

>>> a = { 'sub_dict': { 'b': True }, 'mylist': [100, 200, 300] }
>>> a['sub_dict']['b']
True
>>> a['mylist'][0]
100

Библиотека декодирования и кодирования JSON Python использует эту фичу Python при анализе сложных документов. Она создает вложенные деревья списков, словарей и других допустимых типов данных.

Допустимые ключи

Если захочется, можете поиграться и со значениями ключей. Ограничение тут одно: ключи словаря должны быть неизменяемым типом данных. Поэтому использовать в качества ключа словари, кортежи, словарь и т.д. не получится.

В остальном — используйте, что угодно. Ключами могут быть даже собственные типы данных: float или int, например. Скорее всего, это вам никогда не понадобится, но давайте посмотрим, как это работает:

>>> crazy_dictionary = { int: 1, float: 2, dict: 3 }
>>> crazy_dictionary[dict]
3

Более полезный вариант использования — числа в качестве ключей. Например, давайте создадим словарь, в котором будут записаны номера 3-х участников марафона:

>>> runners = { 1000: 'Jack', 1001: 'Eric', 1002: 'Lisa' }
>>> runners[1001]
'Eric'

Другие способы создания словаря

Существуют более продвинутые способы инициализации словаря, которые, возможно, пригодятся вам.

Конструктор dict()

Функция dict() строит словарь из последовательности или списка пар ключ-значение.

>>> dict([ ('Jack', '070-02222748'), ('Pete', '010-2488634'), ('Eric', '06-10101010') ])
{'Jack': '070-02222748', 'Pete': '010-2488634', 'Eric': '06-10101010'}

Представление словарей (dictionary comprehension)

Как и списки, словари можно создавать при помощи генераторов. Правильнее называть это представлением словарей.

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

Метод dict.fromkeys

Метод dict.fromkeys(keys, value) создает новый словарь, основанный на передаваемом списке ключей. Значение всех ключей при этом будет равно значению переменной value. Если не указать value, передастся None.

>>> names = ('Eric', 'Martha', 'Ellen')
>>> phone_numbers = dict.fromkeys (names, None)
>>> phone_numbers
{'Ellen': None, 'Eric': None, 'Martha ': None}

Парсинг JSON-словаря

Словарь можно создать из JSON-данных. Делается это следующим образом:

>>> import json
>>> jsonstring = '{"имя": "erik", "возраст": 38, "женат": true}'
>>> json.loads(jsonstring)
{'имя': 'erik', 'возраст': 38, 'женат': True}

Использование словарей

Объекты представления словарей

Некоторые встроенные методы словаря возвращают объект представления. Значения в объекте представления изменяются по мере изменения содержимого словаря. Лучше всего проиллюстрировать это на примере:

phone_numbers = { 'Jack': '070-02222748', 'Pete': '010-2488634', 'Eric': '06-10101010' }
names = phone_numbers.keys()
phone_numbers['Linda'] = 9876
print(names)

Этот код выведет на экран объект представления: dict_keys(['Jack', 'Pete', 'Eric', 'Linda']). Как видите, Линда тоже будет находиться в этом списке, хотя ее добавили уже после создания объекта представления names.

Получить доступ и удалить конкретную пару ключ-значение

Мы уже видели, как можно получить доступ и удалить одну пару ключ-значение:

>>> phone_numbers['Eric'] = '06-10101010'
>>> del(phone_numbers['Jack'])

Чтобы перезаписать запись, просто присвойте ключу новое значение. Для этого необязательно предварительно удалять пару с помощью функции del().

Если запрошенного ключа в словаре нет, Python выдаст исключение KeyError.

>>> phone_numbers['lisa']

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'lisa'

Если вы заранее знаете, что каких-то данных может не быть (например, когда вы парсите данные сразу в словарь), убедитесь, что вы обработали это исключение с помощью try ... except.

Получить все ключи из словаря

Есть два простых способа получить все ключи из словаря:

>>> list(phone_numbers)
['Jack', 'Pete', 'Eric']
>>> sorted(phone_numbers)
['Eric', 'Jack', 'Pete']

Функция list() вернет все ключи в том порядке, в котором они расположены в словаре. А функция sorted() — в алфавитном порядке.

Также существует метод dict.keys(), который возвращает представление, содержащий список всех ключей словаря. Преимущество этого объекта в том, что он синхронизируется со словарем. Он идеально подходит для перебора всех ключей, но в list() и sorted() тоже есть смысл: они возвращают список, которым вы затем можете управлять.

Проверить, существует ли ключ в словаре

Вы можете проверить, существует ли тот или иной ключ в словаре с помощью ключевых слов in и not in.

>>> 'Jack' in phone_numbers
True
>>> 'Jack' not in phone_numbers
False

Получить длину словаря

Функция len() вернет количество пар ключ-значение в словаре:

>>> phone_numbers = {'Jack': '070-02222748', 'Pete': '010-2488634', 'Eric': '06 -10101010 '}
>>> len (phone_numbers)
3

Перебрать значения словаря

Метод items() возвращает итерируемый объект представления (см. код ниже). Пройтись по этому объекту можно простым циклом for.

>>> phone_numbers.items() dict_items([('Jack', '070-02222748'), ('Pete', '010-2488634'), ('Eric', '06-10101010')]) 
>>> for name, phonenr in phone_numbers.items():
print(name, ":", phonenr) 

Jack : 070-02222748 
Pete : 010-2488634 
Eric : 06-10101010

Встроенные методы словарей

К каждому словарю можно применить встроенные функции. Ниже— список самых интересных и полезных методов.

  • clear() — удаляет все пары ключ-значение (иначе говоря, очищает словарь). Например, так: phone_nrs.clear().
  • get(key) — возвращает элемент словаря по заданному ключу. Например, так: phone_nrs.get(‘Martha’, ‘Unknown person’).
  • items() — возвращает объект представления, содержащий пары ключ-значение. Например, так: phone_nrs.items().
  • values() — возвращает объект представления, содержащий список значений из словаря. Например, так: phone_nrs.values().
  • pop(key, default_value) — возвращает и удаляет элемент по указанному ключу. Например, так: phone_numbers.pop(‘Martha’).
  • popitem() — возвращает и удаляет последний вставленный элемент. Актуально для Python 3.7+. Например, так: phone_numbers.popitem().
  • setdefault(key, value) — возвращает значение по указанному ключу. Если ключа не существует, он вставляется в словарь с заданным значением. Например, так: phone_numbers.setdefault(‘John Doe’, 1234).
  • update(iterable) — добавляет в словарь все передаваемые пары ключ-значение. Например, так: phone_numbers.update({“Alina”: 1234, “Alice”, 2345}).

Перевод статьи: Python’s Most Powerful Data Type