Словари — один из самых мощных типов данных 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