Словарь — одна из самых популярных структур данных в Python. Но что это такое и как мы можем его использовать?

Когда вы ищете определение слова на любом языке, например английском, вы открываете словарь (конечно, в старые времена) и находите значение. Словарь python именно такой. Словарь в Python — это структура данных, состоящая из пар ключ:значение. Каждый ключ напрямую приводит нас к значению. Например, словарь данных человека будет таким:

{"Имя": Джон, "Адрес": XXX}

Поэтому, когда нам нужно имя человека, мы можем получить его напрямую с помощью ключа «Имя».

Зачем нам это нужно?

Самое лучшее в словарях — это быстрый доступ к элементам. Когда у вас есть список значений, временная сложность поиска значения составляет O(n), где n — длина этого списка (неупорядоченный список). Но в словаре та же временная сложность задачи составляет O(1), поскольку мы можем напрямую перейти к значению!

Python справляется с этим с помощью списка и хеш-функции. Python фактически хранит словарь в виде списка. Итак, теперь вопрос в том, как он может напрямую найти элемент списка? Ответ — хэш-функция. Хеш-функция получает на вход строку и возвращает целое число. Итак, Python использует это как сопоставитель. Например, если хеш("Имя") равно 4, то значение ключа "Имя" находится в индексе 4 списка.

Определить словарь

Есть три способа определить словарь в целом. Первый — определить пустой словарь с помощью dict()functionв python, а затем добавить к нему значение:

d1 = dict()
d1['Name'] = "John"
d1['Address'] = "XXXY"

Второй способ — инициировать словарь при определении:

d2 = {"Name": "John", "Address": "XXX"}

Третий способ — с помощью функции fromkeys. Этот способ подходит, когда мы хотим создать словарь со списком ключей и инициировать их все со значением по умолчанию:

d3 = {}.fromkeys(["Name", "Address", "Phone"], "N/A")

Доступ

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

d = {"Name": "John", "Address": "XXX"}
name = d["Name"]
# name is John

Недостаток: если ключ не существует, Python выдает исключение.

Более безопасным способом доступа к значению является функция Dictionaryget(). Эта функция возвращает значение None вместо создания исключения, если ключ не существует.

d = {"Name": "John", "Address": "XXX"}
name = d.get("Name")
Id = d.get("ID")
Id = d.get("ID", "Not There!")
# name is John and Id is None and Id is Not There!

Примечание: вы можете указать функции get возвращать любое значение вместо None, если ключ не существует, указав второй параметр, например get("Name", "Not There!"). Если «Имя» не существует, Python возвращает «Нет!» вместо Нет.

Обновлять

Чтобы обновить значение, мы можем просто получить к нему доступ с помощью ключа и изменить его:

d = {"Name": "John", "Address": "XXX"}
d['Name'] = "Salt"
# name is Salt!

Второй способ — функция setdefault. Эта функция добавляет новый ключ: значение, если ключ не существует. Если он существует, он ничего не делает.

d = {"Name": "John", "Address": "XXX"}
d.setdefault("phone", "1235")
# phone is 1235!

Последний метод обновления — это функция update. Это удобно, когда вы хотите обновить словарь другим словарем.

d = {"Name": "John", "Address": "XXX"}
d.update({"phone": "12344", "City":"Berlin"})
# Now d also has a City and Phone!

Траверс

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

Чтобы перебрать ключи, мы используем функцию keys():

d = {"Name": "John", "Address": "XXX"}
for key in d.keys():
    print(key)
# Ouput: Name, Address

Для перебора значений мы используем функцию values():

d = {"Name": "John", "Address": "XXX"}
for val in d.values():
    print(val)
# Ouput: John, XXX

Чтобы перебрать пару всех ключей:значений, мы используем функцию items():

d = {"Name": "John", "Address": "XXX"}
for key, val in d.items():
    print(key + ":" + val)
# Ouput: Name:John,  Address:XXX

Сортировка

Последнее, что касается словаря, — это сортировка. Первый подход заключается в использовании функции sorted в Python. Результатом будет отсортированный список ключей словаря.

d = {"a": 2, "b":-1, "c": 0}
print(sorted(d))
# output: ['a', 'b', 'c']

Второй способ — отсортировать ключи словаря по их значению. Для этого мы снова используем функцию sorted и библиотеку operator.

import operator
d = {"a": 2, "b":-1, "c": 0}
s_d = dict(sorted(d.items(), key=operator.itemgetter(1)))
# Output:  {'b': -1, 'c': 0, 'a': 2}

Примечание: функция items() возвращает все пары ключ:значение в виде кортежа, где itemgetter(1) является значением. Результатом сортировки является список кортежей ключ:значение, отсортированных по значению. По этой причине мы вернули его обратно в словарь с помощью dict в python.

Полный код доступен здесь: https://github.com/Pooya-Oladazimi/blog-post-python/blob/master/dict.py.

Конец.