Словари в Python (dict)
У местная аналогия для словаря в языке Python — обычный толковый словарь, где каждому отдельному слову (ключу) соответствует его определение (значение).
А теперь разберёмся подробнее, как в Python устроены словари и как с ними работать.
Что такое словарь и как он устроен
Словари в Python можно считать реализацией структуры данных, более известной как ассоциативный массив.
Способ хранения словаря Python в памяти
Рассмотрим сначала то, как выглядит структура отдельно взятого элемента словаря в pycore_dict.h :
Теперь перейдем к облику самой C-структуры словаря в Python:
Выходит, что, при объявлении нового словаря, в памяти создается объект, состоящий из следующих блоков:
Как и в случае со списками, объект словаря хранит лишь указатели, а не сами значения
Базовая работа со словарями
Объявление словаря
Объявить словарь Python 3 можно несколькими способами. Но сначала рассмотрим наиболее простую ситуацию и создадим пустой словарь:
Теперь объявим и инициализируем словарь из трех элементов через соответствующий литерал и выведем на экран значение третьего элемента:
Помимо литерального объявления, в Python существует возможность объявлять словари при помощи функции dict() :
inventory_dict = dict(right_hand=’sword’, left_hand=’shield’) inventory_dict >
Чуть более хитрые способы создания словарей:
# словарь из десяти элементов со значениями, равными 0 zero_array_dict = dict.fromkeys([‘a0’, ‘b0’, ‘c0’, ‘d0’], 0) zero_array_dict >
key_list = [‘marvel_hero’, ‘dc_hero’] value_list = [‘Spiderman’, ‘Flash’] superhero_dict = dict(zip(key_list, value_list)) superhero_dict >
Обращение к элементу словаря в Python
Извлечь значение элемента словаря можно единственным образом — обратившись к нему по его ключу:
hero_inventory = dict(strong_right_hand=’sword’, strong_left_hand=’shield +3′) what_in_right_hand = hero_inventory[‘strong_right_hand’] # или так: what_in_right_hand = hero_inventory.get(‘strong_right_hand’) print(what_in_right_hand) > sword
В отличие от списков, номеров позиций в словарях нет:
print(any_dict[1]) > Traceback (most recent call last): File «
«, line 1, in print(any_dict[1]) NameError: name ‘any_dict’ is not defined
💭 Подобная ошибка возникнет и в том случае, если вы, по какой-то причине, вдруг решите извлечь значение по несуществующему ключу.
Добавление нового элемента в словарь
Для того чтобы добавить в словарь новые данные достаточно новому ключу этого словаря назначить какое-либо значение. Добавление выглядит так:
superhero_dict = <'dc_hero': 'Flash'>superhero_dict[‘dark_horse_hero’] = ‘Hellboy’ print(superhero_dict) >
Аналогичным образом можно произвести замену существующего значения по его ключу:
superhero_dict[‘dc_hero’] = ‘Batwoman’ print(superhero_dict) >
Удаление элемента из словаря
Для того чтобы удалить запись в словаре воспользуемся оператором del :
# запись “’dark_horse_hero’: ‘Hellboy’” исчезнет. Прости, Красный! del superhero_dict[‘dark_horse_hero’] print(superhero_dict) >
Проверка на наличие ключа в словаре Python
Как отмечалось выше, обращение по несуществующему ключу вызывает ошибку в работе интерпретатора. Поэтому, наличие ключа в словаре следует проверять. За это дело отвечает оператор in :
if ‘marvel_hero’ in superhero_dict: print («Да, такой ключ есть») else: print(«Этот ключ в словаре отсутствует!») > Да, такой ключ есть # запись с ключом ‘dark_horse_hero’ была удалена нами чуть выше if ‘dark_horse_hero’ in superhero_dict: print («Да, такой ключ есть») else: print(«Этот ключ в словаре отсутствует!») > Этот ключ в словаре отсутствует!
💡 Кстати говоря, использование метода get() позволяет корректно обработать ситуацию, когда запрашивается значение по несуществующему ключу. Достаточно в качестве второго параметра написать значение по умолчанию:
my_hero = superhero_dict.get(‘dark_horse_hero’, ‘Этот ключ в словаре отсутствует!’) print(my_hero) > Этот ключ в словаре отсутствует!
Длина словаря в Python
Стоит помнить, что словарь — это лишь набор отображений, а не последовательность, однако количество записей в нём мы все еще можем получить, воспользовавшись функцией len() :
treasure = dict(t1=’gold’, t2=’necklace’) num_of_items = len(treasure) print(num_of_items) > 2
Не самая богатая добыча! 🙄
Сортировка словаря
Так как словарь состоит из пар, то и отсортировать его можно, как по ключам, так и по значениям.
Сортировка по значению А вот — один из вариантов сортировки словаря по значениям:
👉 Здесь стоит учитывать, что, сама по себе, запись sorted(elements.items(), key= lambda x: x[1]) будет возвращать не словарь, а отсортированный список кортежей. Поэтому более правильным вариантом будет:
Перебор словаря в Python
Не является великой тайной и тот факт, что словарь, являющийся, по сути своей, набором пар (т.е. коллекцией), можно всячески итерировать. Один из способов — перебор по ключам:
Объединение словарей
Когда заходит речь об объединении двух словарей, то обязательно следует упомянуть, что для пары сущностей типа «словарь» оператор «+»не определен. Причина этого становится довольно очевидной — стоит лишь вспомнить, что словарь не является последовательностью, а также задуматься над тем, какая именно операция на множестве словарей должна быть реализована этим самым оператором «+». Поэтому как-то так:
dict_1 = <'010120': 55000, '030420': 8500, '170420': 30000>dict_2 = <'050520': 2900, '160520': 16573>print(dict_1 + dict_2) Traceback (most recent call last): File «test.py», line 4, in print(dict_1 + dict_2) TypeError: unsupported operand type(s) for +: ‘dict’ and ‘dict’
💭 Если бы showcase_2 содержал ключи, присутствующие в showcase_1, то значения, ассоциированные с этими ключами, в результирующем словаре были бы взяты именно из showcase_2.
Ограничения
Создавая словарь, вы не должны забывать о некоторых ограничениях, накладываемых, в основном, на его ключи.
Методы словарей в Python
Перечислим основные словарные методы, которые помогут вам при работе с этим типом данных.
# clear() farewell_dict = <'a': 'word', 'b': 3, 'c': 'x', 'd': 1, 'e': 12>farewell_dict.clear() print(farewell_dict) > <> # get() seasons = <'winter': 'cold', 'summer': 'hot', 'autumn': 'cold'>print(seasons.get(‘winter’, ‘Такого ключа в словаре нет’)) > cold seasons_2 = <'spring': 'warm'>print(seasons_2.get(‘nonexistent_key’, ‘Этот ключ отсутствует’)) > Этот ключ отсутствует seasons_3 = <'winter': 'surprice_warm'>print(seasons_3.get(‘nonexistent_key’)) > None # items() pairs_dict = <'41': 41, '42': 42, '43': 43>print(pairs_dict.items()) > dict_items([(’41’, 41), (’42’, 42), (’43’, 43)]) # keys() promo_dict = <'modelA': 100000, 'modelB': 300000, 'modelC': 120000>print(promo_dict.keys()) > dict_keys([‘modelA’, ‘ modelB’, ‘modelC’]) # values() palette = <'color1': 'red', 'color2': 'white', 'color3': 'purple'>print(palette.values()) > dict_values([‘red’, ‘white’, ‘purple’]) # pop() id_dict = <'Alex': 101546, 'Rachel': 116453, 'Johanna': 144172>print(id_dict.pop(‘Alex’)) > 101546 print(id_dict) > <'Rachel': 116453, 'Johanna': 144172># Ключ, само собой, должен присутствовать в словаре. # popitem() another_dict = <'t': 16, 'g': 53, 'y': 112, 'h': 23>print(another_dict.popitem()) > (‘h’, 23) print(another_dict) > <'t': 16, 'g': 53, 'y': 112># update() first_dictionary = <'p': 55, 'o': 44, 'i': 33>second_dictionary = <'l': 22, 'k': 11, 'p': 'changed'>first_dictionary.update(second_dictionary) print(first_dictionary) > <'p': 'changed', 'o': 44, 'j': 33, 'l': 22, 'k': 11># copy() some_dict = <'z': 1, 'x': 3, 'v': 12, 'n': 33>copy_dict = some_dict.copy() print(copy_dict) >
Приведение Python-словарей к другим типам
dict to json
Чтобы сериализовать словарь в json формат, сперва необходимо импортировать сам модуль json:
Теперь можно развлекаться. Существует два схожих метода:
dict to list
medicine_chest = dict(top_part=’potion’, bot_part=’bandage’) medicine_list = [] for key, con in medicine_chest.items(): temp = Что может быть ключом словаря python medicine_list.append(temp) print(medicine_list) > [[‘top_part’, ‘potion’], [‘bot_part’, ‘ bandage’]]
dict to string
food_machine = dict(tier_1=’juice’, tier_2=’chocolate’) f_machine_str = str(food_machine) print(f_machine_str) >
Генератор словарей
В Python существует возможность создавать словари с помощью генераторов. Генераторы выполняют цикл, отбирают key:value пары на каждой итерации и заполняют, таким образом, новый словарь.
Создадим словарь, где нескольким элементам ряда натуральных чисел приводятся в соответствие их квадраты:
Также генератор удобен, когда нужно инициализировать какой-то имеющийся список ключей:
list_of_keys = [‘q’, ‘w’, ‘e’, ‘r’, ‘t’] generated_dict =
Вложенные словари
Отдельного упоминания заслуживает тот факт, что элемент словаря может принимать в качестве значения другой словарь:
# где-то улыбается один Xzibit nesting_d = <'fk': <'input_lvl_one': <'input_lvl_two': 42>>> print(nesting_d[‘fk’][‘input_lvl_one’][‘input_lvl_two’]) > 42
💭 Число уровней вложенности словарей неограниченно!
Альтернативы словарям
OrderedDict
defaultdict
Counter
Counter — подтип словаря, подсчитывающий и хранящий количество совпадающих неизменяемых элементов последовательности. Однако Counter() обладает и своими небезынтересными методами:
Наверно вы заметили, что словари и списки (о которых, кстати, вы можете почитать в нашей предыдущей статье » Списки в Python «) схожи как, внешне, так и в том, что могут изменять свой размер по необходимости.
Вообще говоря, и списки и словари — это изменяемые объекты, однако операции, провоцирующие изменения для этих типов данных, различны. Различаются они ещё и тем, что элементы словарей сохраняются по ключам, а не по позициям. Так или иначе, оба типа коллекций входят в число наиболее важных и часто применяемых на практике в языке Python.
Словарь Python: пример обновления, Cmp, Len, Sort, Copy, Items, str
Дата публикации: 2019-06-17
От автора: словари являются еще одним примером структуры данных. Словарь используется для сопоставления или связывания вещей, которые вы хотите хранить с ключами, необходимыми для их получения. Словарь в Python похож на словарь в реальном мире.
Словарь Python определяется двумя элементами: ключами и значениями.
Ключи представлены одним элементом
Значения могут быть списком или списком в списке, числами и т. д.
В этом руководстве мы рассмотрим:
Бесплатный курс «Python. Быстрый старт»
Получите курс и узнайте, как создать программу для перевода текстов на Python
Методы словаря Python
Удаление ключей из словаря
Метод словаря items()
Встроенные функции словаря
Метод списка Python cmp()
Синтаксис для словаря Python:
Словарь указан в фигурных скобках, внутри этих фигурных скобок объявляются ключи и значения. Каждый ключ отделяется от своего значения двоеточием (:), а каждый элемент — запятыми.
Свойства ключей словаря
При использовании ключей словаря есть два важных момента.
Не допускается более одной записи для каждого ключа (дубликат ключа не допускается)
Значения в словаре могут быть любого типа, в то время как ключи должны быть неизменяемыми, числа, кортежи или строки.
Ключи словаря чувствительны к регистру. То же имя ключа, но с другим регистром в словарях Python рассматривается как разные ключи.
В коде у нас есть словарь с названием «Dict»
Мы объявили в словаре имя и возраст человека, где имя — «ключи», а возраст — «значение».
Теперь запустите код
Он возвращает из словаря возраст Тиффани.
Методы словаря Python
Копирование словаря
Вы также можете скопировать весь словарь в новый словарь. Например, здесь мы скопировали наш оригинальный словарь в новые словари «Boys» и «Girls».
У нас есть оригинальный словарь (Dict) с именем и возрастом мальчиков и девочек вместе
Но мы хотим, чтобы список мальчиков отличался от списка девочек, поэтому мы определили элемент для мальчиков и девочек в отдельных словарях «Boys» и «Girls».
Теперь мы снова создали новые словари с именами «studentX» и «studentY», где все ключи и значения словаря Boys копируются в studentX, а словаря Girls — в studentY
Так что теперь вам не нужно просматривать весь список в главном словаре (Dict), чтобы узнать, кто является мальчиком, а кто девочкой, вам просто нужно вывести studentX, если вам нужен список мальчиков, и StudentY, если вам нужен список девочек
Итак, когда вы запустите словарь studentX и studentY, он выдаст все элементы, присутствующие в словаре «boys» и «girls» отдельно
Обновление словаря
Вы также можете обновить словарь, добавив новую запись или пару ключ-значение в существующую запись или удалив существующую запись. Здесь в примере мы добавим другое имя «Sarah» в наш существующий словарь.
Словари (dict, dictionary) в Python
Введение
Словарь — это пример хранилища значений ключей, также известного как Mapping в Python. Он позволяет хранить и извлекать элементы, ссылаясь на ключ. Так как словари ссылаются по ключу, в них быстро работает поиск, поскольку они в основном используются для ссылки на элементы по ключу и они не сортируются.
Доступ к значениям словаря
Строка «Hello» в этом примере называется ключом. Он используется для поиска значения в словаре, помещая ключ в квадратные скобки.
Число 1234 видно после соответствующего двоеточия в словаре. Это значение, на которое ведёт «Hello» в словаре.
x = dictionary.get(«whatever», «nuh-uh»)
Конструктор dict()
Конструктор dict() можно использовать для создания словарей из именованных аргументов или из одной итерируемой пары ключ-значение или из одного словаря и именованного аргумента.
Как избегать исключений KeyError
Распространённая ошибка при использовании словарей — доступ к несуществующему ключу. Это обычно приводит к исключению KeyError :
Другой способ избавиться от ошибки — перехватить исключение
Вы также можете проверить, есть ли ключ словаре:
Обратите внимание, что в многопоточных средах ключ может быть удален из словаря после проверки, создавая состояние, при котором всё ещё может быть выдано исключение.
Доступ к ключам и значениям
При работе со словарями часто требуется получить доступ ко всем ключам и значениям в словаре, в цикле for, в генераторе списка или просто в виде простого списка.
Словарь будет таким:
Вы можете получить список ключей, используя метод keys или функцию dict_keys :
Если вместо этого вы хотите получить список значений, используйте метод values или функцию dict_values :
Если вы хотите работать как с ключом, так и с соответствующим значением, вы можете использовать метод items или функцию dict_ items :
Введение в словарь
Создание словаря
Словари можно создавать разными способами:
С помощью литерала
С помощью генератора словаря
Через встроенный класс dict()
Модификация словаря
Чтобы добавить элементы в словарь нужно создать новый ключ со значением:
Также можно добавить список или словарь в качестве значения:
Чтобы удалить элемент, нужно удалить ключ из словаря:
Словари со значениями по умолчанию
Доступно в стандартной библиотеке как defaultdict
Если вам нужно добавить много значений, dict.setdefault() будет создавать новый экземпляр начального значения (в этом примере a[]) каждый раз, когда оно вызывается, создавая лишнюю нагрузку.
Как создать упорядоченный словарь
Вы можете создать упорядоченный словарь, который будет следовать определенному порядку при переборе ключей в словаре.
Распаковка словарей с помощью оператора **
Вы можете использовать оператор распаковки именованного аргумента слова ** для доставки пар ключ-значение в словаре в аргументы функции. Упрощенный пример из официальной документации:
Начиная с Python 3.5 вы также можете использовать этот синтаксис для объединения произвольного числа объектов [ dict ].
Этот пример показывает, что дубликаты ключей соответствуют последнему значению (например, «Клиффорд» переопределяет «Немо»).
Объединений словарей
Рассмотрим разные словари:
Python 3.5+
В этом примере, дубликаты ключей соответствуют последнему значению (например, «Клиффорд» переопределяет «Немо»).
Python 3.3+
Здесь первостепенное значение отдаётся кокретному ключу, а не последнему («Клиффорд» выбрасывается в пользу «Немо»).
Python 2.x, 3.x
Здесь используется последнее значение, как и в методе слияния [**] («Клиффорд» переопределяет «Немо»).
Замыкающая запятая
Также как в списках или кортежах, можно добавлять замыкающую запятую в своем словаре.
PEP 8 требует, чтобы вы оставляли пробел между замыкающей запятой и закрывающей скобкой.
Все комбинации значений словаря
Вы можете создать список, который возвращает все такие комбинации значений, используя следующий код.
Это дает нам следующий список, хранящийся в переменной combinations :
Перебор словаря
Если вы используете словарь в качестве итератора (например, в операторе for ), он перемещает ключи в словаре. Например:
Работает таким же образом в генераторах:
Метод items() можно использовать для одновременного зацикливания ключа и значения:
Метод values() можно использовать для перебора только значений:
Создание словаря
Правила создания словаря:
Примеры словарей
Словари сопоставляют ключи со значениями
Доступ к значениям словаря осуществляется по их ключам
Словари также могут быть созданы в стиле JSON:
Значения словаря могут быть перебраны:
Синтаксис
Примечания
Что следует помнить при использовании словаря:
– каждый ключ должен быть уникальным (иначе он будет переопределен);
– каждый ключ должен быть хэшируемым (для хеширования применяется функция hash) в противном случае возникнет исключение TypeError;
– для ключей нет определённого порядка.
Научим основам Python и Data Science на практике
Это не обычный теоритический курс, а онлайн-тренажер, с практикой на примерах рабочих задач, в котором вы можете учиться в любое удобное время 24/7. Вы получите реальный опыт, разрабатывая качественный код и анализируя реальные данные.
Что может быть ключом словаря python
Словари являются отображениями.
Словари являются изменяемыми объектами.
Объявление
Кроме того, можно объявить их при помощи конструктора dict().
Ключи
Ключами словаря могут являться только объекты, поддерживающие хеширование. Таким образом, использовать в качестве ключей списки, словари и другие изменяемые типы не получится.
Если в словарь будут добавлены несколько значений с одним и тем же ключом, словарь сохранит последнее.
Порядок ключей
Данные в обычном словаре упорядочены по очередности добавления ключей, начиная с +py3.6 (в +py2.7 — не упорядочены, но последовательность детерминирована, воспроизводима; в +py3.5 — не упорядочены, последовательность не детерминирована, не воспроизводима между запусками).
Если требуется хранить порядок, в котором в словарь были добавлены элементы (например для обхода этих элементов), следует использовать collections.OrderedDict().
Значения
В качестве значений могут использоваться любые объекты.
Получение значений
Доступ к значениям производится при помощи ключей.
Если ключ отсутствует в словаре, возбуждается исключение KeyError.
+py2.5 Чтобы изменить это поведение можно в наследнике dict определить метод __missing__(key), в котором описать нужные действия при отсутствии ключа.
Установка значений
Кроме установки значений при создании словаря, можно дополнять его по мере надобности.
Определение наличия/отсутствия элемента
+py2.2 Определить, присутствует ли ключ в словаре можно при помощи конструкции in.
+py2.2 Определить, отсутствует ли ключ в словаре можно при помощи антонимичной конструкции not in.
Количество элементов в словаре
Количество элементов можно получить, используя функцию len().
Детали реализации CPython
Словари реализованы при помощи динамических хеш-таблиц. По сравнению с двоичными деревьями, это, в большинстве случаев, даёт выигрыш при получшении значений (наиболее часто используемая операция); кроме этого упрошается реализация.
Что может быть ключом словаря python
Обычные списки (массивы) представляют собой набор пронумерованных элементов, то есть для обращения к какому-либо элементу списка необходимо указать его номер. Номер элемента в списке однозначно идентифицирует сам элемент. Но идентифицировать данные по числовым номерам не всегда оказывается удобно. Например, маршруты поездов в России идентифицируются численно-буквенным кодом (число и одна буква), также численно-буквенным кодом идентифицируются авиарейсы, то есть для хранения информации о рейсах поездов или самолетов в качестве идентификатора удобно было бы использовать не число, а текстовую строку.
Итак, каждый элемент словаря состоит из двух объектов: ключа и значения. В нашем примере ключом является название страны, значением является название столицы. Ключ идентифицирует элемент словаря, значение является данными, которые соответствуют данному ключу. Значения ключей — уникальны, двух одинаковых ключей в словаре быть не может.
В жизни широко распространены словари, например, привычные бумажные словари (толковые, орфографические, лингвистические). В них ключом является слово-заголовок статьи, а значением — сама статья. Для того, чтобы получить доступ к статье, необходимо указать слово-ключ.
Другой пример словаря, как структуры данных — телефонный справочник. В нем ключом является имя, а значением — номер телефона. И словарь, и телефонный справочник хранятся так, что легко найти элемент словаря по известному ключу (например, если записи хранятся в алфавитном порядке ключей, то легко можно найти известный ключ, например, бинарным поиском), но если ключ неизвествен, а известно лишь значение, то поиск элемента с данным значением может потребовать последовательного просмотра всех элементов словаря.
Особенностью ассоциативного массива является его динамичность: в него можно добавлять новые элементы с произвольными ключами и удалять уже существующие элементы. При этом размер используемой памяти пропорционален размеру ассоциативного массива. Доступ к элементам ассоциативного массива выполняется хоть и медленнее, чем к обычным массивам, но в целом довольно быстро.
Когда нужно использовать словари
Создание словаря
Пустой словарь можно создать при помощи функции dict() или пустой пары фигурных скобок <> (вот почему фигурные скобки нельзя использовать для создания пустого множества). Для создания словаря с некоторым набором начальных значений можно использовать следующие конструкции:
Работа с элементами словаря
Перебор элементов словаря
Можно легко организовать перебор ключей всех элементов в словаре:
Следующие методы возвращают представления элементов словаря. Представления во многом похожи на множества, но они изменяются, если менять значения элементов словаря. Метод keys возвращает представление ключей всех элементов, метод values возвращает представление всех значений, а метод items возвращает представление всех пар (кортежей) из ключей и значений.





