Что может быть ключом словаря
Перейти к содержимому

Что может быть ключом словаря

  • автор:

Словари

Словари — еще один встроенный тип данных для хранения объектов. Они используются для связывания одного объекта, называемого ключом, с другим, называемым значением. Такое связывание называется отображением. Результатом отображения будет пара ключ-значение. Пары ключ-значение добавляются в словарь. Затем вы можете найти в словаре ключ и получить соответствующее ему значение. Однако нельзя, наоборот, использовать значение для нахождения ключа.

Словари, как и списки, изменяемы. То есть, в них можно добавлять новые пары ключ-значение. Их полезность заключается в связях между ключами и значениями — существует множество ситуаций, в которых вам потребуется сохранять данные попарно. Например, в словаре можно сохранить информацию о телефонных номерах ваших друзей:

phones =
"Иван": "+7123456789",
"Василий": "+37520123456"
>
print(phones)

При создании словаря нужно использовать фигурные скобки, отделять ключ от значения двоеточием, а пары ключ-значение разделять запятыми. В отличие от кортежей, если у вас есть только одна пара ключ-значение, запятая после нее не нужна.

Как только вы создали словарь, можете добавлять в него пары ключ-значение, используя синтаксис имя\_словаря[ключ] = значение , а также искать значение при помощи ключа, используя синтаксис имя_словаря[ключ] .

phones =
"Иван": "+7123456789",
"Василий": "+37520123456"
>
phones['Григорий'] = 1234567890
print(phones['Иван'])

Значением в словаре может быть любой объект. В предыдущем примере первые два значения были строками, а последнее значение, 1234567890 , — целым числом.

В отличие от значения словаря, ключ словаря должен быть неизменяемым. Ключом словаря может быть строка или кортеж, но не список или словарь. Для определения того, есть ли ключ в словаре, используйте ключевое слово in , а not in — для проверки отсутствия ключа.

phones =
"Иван": "+7123456789",
"Василий": "+37520123456"
>
print("Василий" in phones) # True

Из словаря можно удалить пару ключ-значение с помощью ключевого слова del .

phones =
"Иван": "+7123456789",
"Василий": "+37520123456"
>
del phones["Василий"]

Вы можете сохранять контейнеры в других контейнерах. Например, можно хранить списки внутри списка.

music =
"rap": ["Баста", "Кравц", "Злой Дух"],
"rock": ["Наутилус Помпилиус", "Кино", "Ария"],
"djs": ["Paul Oakenfold", "Tiesto"]
>

В этом примере словарь music имеет три ключа, каждый из которых является списком: К этим спискам можно получить доступ с помощью соответствующих ключей

music =
"rap": ["Баста", "Кравц", "Злой Дух"],
"rock": ["Наутилус Помпилиус", "Кино", "Ария"],
"djs": ["Paul Oakenfold", "Tiesto"]
>
print(music['rap']) # ['Баста', 'Кравц', 'Злой Дух']
print(music['rock'][-1]) # Ария

Что может быть ключом словаря

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2024. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

dict (словарь)

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

**kwargs — Поддерживаются также необязательные именованные аргументы. При использовании вкупе с позиционными аргументами и совпадении ключей значениями из именованных пользуются приоритетом.

Словари являются отображениями.
Словари являются изменяемыми объектами.

Объявление

В коде словари могут быть объявлены при помощи фигурных скобок — <> .

 my_dict = 'key': 'value', 
'sub_dict': <>,
2: [1, 2, 3, 4],
>

# Словарь как слияние других словарей
dict_one =
dict_two =

my_dict = **dict_one,
**dict_two,
> #

Кроме того, можно объявить их при помощи конструктора dict().

 # Пустой словарь. 
my_dict = dict()

# Словарь из итерирующегося объекта.
my_dict = dict(zip(['one', 'two', 'three'], [1, 2, 3]))

# Словарь из именованных аргументов.
my_dict = dict(one=1, two=2, three=3)

# Словарь из списка кортежей.
my_dict = dict([('two', 2), ('one', 1), ('three', 3)])
Ключи

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

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

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

Порядок ключей
Данные в обычном словаре упорядочены по очередности добавления ключей, начиная с +py3.6 (в +py2.7 — не упорядочены, но последовательность детерминирована, воспроизводима; в +py3.5 — не упорядочены, последовательность не детерминирована, не воспроизводима между запусками).

Если требуется хранить порядок, в котором в словарь были добавлены элементы (например для обхода этих элементов), следует использовать collections.OrderedDict().

Значения

В качестве значений могут использоваться любые объекты.

Получение значений
Доступ к значениям производится при помощи ключей.

Если ключ отсутствует в словаре, возбуждается исключение KeyError.
+py2.5 Чтобы изменить это поведение можно в наследнике dict определить метод __missing__(key), в котором описать нужные действия при отсутствии ключа.

 my_dict =  
my_value = my_dict['key'] # value

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

 my_dict =  
my_dict['new_key'] = 'new_value' # Добавляем новый элемент словаря.
Определение наличия/отсутствия элемента

+py2.2 Определить, присутствует ли ключ в словаре можно при помощи конструкции in.
+py2.2 Определить, отсутствует ли ключ в словаре можно при помощи антонимичной конструкции not in.

 my_dict = 

# in
# Ключ 'key' существует, поэтому 'my_key_present' True
my_key_present = 'key' in my_dict
# Ключ 'another_key' отсутствует в словаре, поэтому 'my_key_present' False
my_key_present = 'another_key' in my_dict

# not in
# Ключ 'key' существует, поэтому 'my_key_absent' False
my_key_absent = 'key' not in my_dict
# Ключ 'another_key' отсутствует в словаре, поэтому 'my_key_absent' True
my_key_absent = 'another_key' not in my_dict
Количество элементов в словаре

Количество элементов можно получить, используя функцию len().

 my_dict =  
my_dict_length = len(my_dict) # 1
Детали реализации CPython

Словари реализованы при помощи динамических хеш-таблиц. По сравнению с двоичными деревьями, это, в большинстве случаев, даёт выигрыш при получшении значений (наиболее часто используемая операция); кроме этого упрошается реализация.

Для каждого ключа при помощи функции hash() вычисляется хеш-код. Код этот широко варьируется в зависимости от ключа и данных процесса (например, хеш для «Python» может быть -539294296 , в то время как для «python» — отличается от первого одним битом — он будет 1142331976 ). Хеш используется для определения места (во внутреннем массиве), где хранится значение. В случае если все используемые вами ключи будут иметь различные хеши, для получения значения по ключу будет затрачено постоянное время — O(1).

На заметку

О сложности основных операций для данного типа можно узнать из статьи «Сложность операций со словарями».

Обзор возможностей словаря dict в Python

Словари встречаются и в других языках как, только называются по разному, например «ассоциативная память» или «ассоциативные массивы». В отличие от последовательностей, которые индексируются диапазоном чисел, словари индексируются ключами, которые могут быть любого неизменяемого типа. Строки и числа всегда могут быть ключами. Кортежи могут использоваться в качестве ключей, если они содержат только строки, числа или кортежи. Если кортеж содержит любой изменяемый объект прямо или косвенно, он не может использоваться в качестве ключа.

Нельзя использовать списки в качестве ключей словаря, так как списки могут быть изменены на месте с помощью индексов, срезов или методов, таких как append() и extend() .

Лучше всего рассматривать словарь как набор пар «ключ-значение» с требованием, чтобы ключи были уникальными в пределах одного словаря. Пара фигурных скобок создает пустой словарь: ‘<>‘ . Размещение разделенного запятыми списка пар key: value в фигурных скобках добавляет пары key: value в словарь. Так же словари записываются в коде.

Основное применение словаря — это хранение значения с некоторым ключом и извлечение значения из словаря, заданного ключом. Также можно удалить пару key:value используя инструкцию del .

Если в словарь добавляется новый ключ, который уже используется, старое значение, связанное с этим ключом, будет забыто. Извлечение значения с помощью несуществующего ключа является ошибкой. Если ошибки при извлечении значений не желательны, то необходимо использовать метод словаря dict.get() . Метод dict.get() возвращает None или указанное значение по умолчанию, если ключа не существует.

Выполнение list(d) в словаре возвращает список всех ключей, используемых в словаре, в порядке вставки. Если вы хотите, чтобы он был отсортирован, просто используйте sorted(d) .

Варианты использования словарей dict в Python.

  • Основные операции со словарями;
  • Варианты создания словаря;
  • Списки-представления словаря;
  • Выражение-генератор словаря;
  • Использование функций в качестве значений словаря;
  • Имитация конструкции switch/case словарем Python.

Основные операции со словарями Python.

>>> tel = 'jack': 4098, 'sape': 4139> >>> tel['guido'] = 4127 >>> tel # # извлечение значения по ключу >>> tel['jack'] # 4098 # извлечение значения по ключу со значением # по умолчанию (если такого ключа нет) >>> tel.get('joy', 2021) # 2021 # удаление и добавление элементов словаря >>> del tel['sape'] >>> tel['irv'] = 4127 >>> tel # # преобразование ключей словаря в список >>> list(tel) # ['jack', 'guido', 'irv'] # сортировка словаря >>> sorted(tel) # ['guido', 'irv', 'jack'] # проверка наличия ключа в словаре >>> 'guido' in tel # True >>> 'jack' not in tel # False 

Варианты создания словаря Python.

Класс dict() строит словарь непосредственно из последовательностей пар ключ-значение:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) #

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

>>> dict(sape=4139, guido=4127, jack=4098) #

Для создания словарей из произвольных ключей и значений можно использовать генераторы-словарей.

>>> x: x**2 for x in (2, 4, 6)> # # словарь генерируется из 2-х списков >>> x: y for x, y in zip(['a', 'b', 'c'], [1, 2, 3])> #

Списки-представления словаря Python.

Словарь содержит очень полезные методы, которые называются списки-представления dict.keys() , dict.values() , dict.items() , которые изменяются динамически. Это значит, что все изменения, такие как удаление, изменение или добавление значений в словаре сразу отражаются на соответствующем представлении.

>>> x = 'one': 1, 'two': 2, 'three': 3, 'four': 4> >>> keys = x.keys() >>> values = x.values() >>> items = x.items() # Производим операции со словарем 'x', а все # отражается на списках-представлениях >>> x['one'] = 0 >>> values # dict_values([0, 2, 3, 4]) >>> items # dict_items([('one', 0), ('two', 2), ('three', 3), ('four', 4)]) >>> x['ten'] = 10 >>> keys # dict_keys(['one', 'two', 'three', 'four', 'ten']) >>> values # dict_values([0, 2, 3, 4, 10]) >>> items # dict_items([('one', 0), ('two', 2), ('three', 3), ('four', 4), ('ten', 10)]) >>> del x['three'] >>> items # dict_items([('one', 0), ('two', 2), ('four', 4), ('ten', 10)]) >>> values # dict_values([0, 2, 4, 10]) >>> keys # dict_keys(['one', 'two', 'four', 'ten']) 

Обратите внимание, что присвоение значений keys , values и items происходит только в начале кода, а отслеживание изменений в словаре идет до конца кода.

>>> x = 'one': 0, 'two': 20, 'three': 3, 'four': 4> >>> keys = x.keys() >>> 'one' in keys # True >>> values = x.values() >>> 3 in values # True >>> items = x.items() >>> ('three', 3) in items # True 

Выражение-генератор словаря Python.

При помощи выражения генератора словаря можно сделать много интересного.

Пример обмена местами (инверсии) ключей и значений словаря, при этом помним, что ключом может быть только неизменяемый объект.

>>> d = 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5> >>> y: x for x, y in d.items()> #

Пример фильтра ключей и значений словаря. Отберем ключи и значения словаря, отвечающие определенным условиям. В результате будет создан новый словарь.

>>> d = 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5> # отберем элементы словаря, ключи которых имеют значения 'a' или # 'c' или 'e', а значения этих ключей должны быть больше 1 >>> key: val for key, val in d.items() if key in ('a', 'c', 'e') and val > 1> #

Пример сортировки словаря по значению:

>>> x = 1: 2, 3: 4, 4: 3, 2: 1, 0: 0> >>> k: v for k, v in sorted(x.items(), key=lambda item: item[1])> #
>>> x = 1: 2, 3: 4, 4: 3, 2: 1, 0: 0> >>> dict(sorted(x.items(), key=lambda item: item[1])) #

Использование функций в качестве значений словаря Python.

Так как функции в Python являются объектами, то можно заменить значения ключей словаря функциями и возвращать их, если ключи совпадают.

Очень простой пример.

# словарь с функциями calc =  "plus": lambda x, y: x + y, "minus": lambda x, y: x - y, "division": lambda x, y: x / y, # в качестве значения используем # встроенную функцию pow() "power": pow > # типа фабрики функций def action(match, dictionary, default="NO CALC"): for key in dictionary.keys(): if match in key: return dictionary[key] return lambda *x: default >>> plus = action('plus', calc) >>> minus = action('minus', calc) >>> power = action('power', calc) >>> square = action('square', calc) >>> plus(5, 4) # 9 >>> minus(5, 4) # 1 >>> power(3, 3) # 27 >>> square(1, 1) 'NO CALC' >>> square(1) 'NO CALC' 

Можно использовать словарь с функциями напрямую, если лень создавать фабрику (далее будет рассмотрена фабрика на collections.defaultdict() и лямбда-функциях):

# словарь с функциями calc =  "plus": lambda x, y: x + y, "minus": lambda x, y: x - y, "division": lambda x, y: x / y, # в качестве значения используем # встроенную функцию pow() "power": pow > >>> calc['plus'](5, 4) # 9 >>> calc['minus'](5, 4) # 1 >>> calc['division'](9, 3) # 3.0 >>> calc['power'](3, 3) # 27 

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

def handle_event(e): print(f"Обработка события в 'handler_event' с помощью: e>") return e def handle_other_event(e): print(f"Обработка события в 'handle_other_event' с помощью: e>") return e functions =  "event1": lambda arg: handle_event(arg["some-key"]), "event2": lambda arg: handle_other_event(arg["some-other-key"]), > event =  "some-key": "value", "some-other-key": "different value", > print(functions["event1"](event)) # Обработка события в 'handler_event' с помощью: value # value print(functions["event2"](event)) # Обработка события в 'handle_other_event' с помощью: different value # different value 

Имитация конструкции switch/case словарем Python.

В случае, если необходимо эмулировать поведение операторов switch/case , то следует рассмотреть возможность использования значения по умолчанию, когда ключ словаря отсутствует. Плюс ко всему здесь будем использовать диспетчеризацию для функций, требующих более одной строки кода (лямбда-функции хороши для простых случаев).

Вот как это сделать:

from collections import defaultdict def add(x, y): return x + y def mul(x, y): return x * y cases = defaultdict(lambda *args: lambda *a: "Invalid option",  "add": add, "mul": mul, >) >>> cases["add"](5, 3)) # 8 >>> cases["plus"](5, 3)) # Invalid option 

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

Этот фрагмент использует collections.defaultdict , первый аргумент которого указывает «фабрику по умолчанию«, которая представляет собой функцию, которая будет вызываться, когда ключ не найден. Можно заметить, что здесь используются две лямбда-функции. Первая предназначена для перехвата любого количества переданных ему аргументов, а вторая — для того чтобы вернуть вызываемый объект.

  • Встроенный класс dict() .
  • Тип dict , словари в Python.
  • Методы словарей и поддерживаемые операции.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *