какие типы данных могут быть ключами словаря python
Словари и их методы в Python
Авторизуйтесь
Словари и их методы в Python
Что такое словарь
Словарь — неупорядоченная структура данных, которая позволяет хранить пары «ключ — значение». Вот пример словаря на Python:
Данный словарь использует строки в качестве ключей, однако ключом может являться в принципе любой неизменяемый тип данных. Значением же конкретного ключа может быть что угодно. Вот ещё один пример словаря, где ключами являются числа, а значениями — строки:
Важное уточнение: если вы попробуете использовать изменяемый тип данных в качестве ключа, то получите ошибку:
Прим. перев. На самом деле проблема не с изменяемыми, а с нехэшируемыми типами данных, но обычно это одно и то же.
Получение данных из словаря
Опять же, вы получите ошибку, если попытаетесь получить значение по несуществующему ключу. Для избежания подобных ошибок существуют методы, о которых мы сейчас поговорим.
Добавление и обновление ключей
Добавление новых пар в словарь происходит достаточно просто:
Обновление существующих значений происходит абсолютно также:
Удаление ключей
Для удаления ключа и соответствующего значения из словаря можно использовать del
Методы
Словари в Python имеют множество различных полезных методов, которые помогут вам в работе с ними. Вот лишь некоторые из них:
Update
Метод update() пригодится, если нужно обновить несколько пар сразу. Метод принимает другой словарь в качестве аргумента.
Если вас интересует, почему данные в словаре расположены не в том порядке, в котором они были внесены в него, то это потому что словари не упорядочены.
Метод можно использовать для проверки наличия ключей в словаре:
Метод pop() удаляет ключ и возвращает соответствующее ему значение.
Метод keys() возвращает коллекцию ключей в словаре.
Values
Метод values() возвращает коллекцию значений в словаре.
Items
Метод items() возвращает пары «ключ — значение».
Итерация через словарь
Вы можете провести итерацию по каждому ключу в словаре.
В примере кода ниже ниже цикл for использует метод items() для получения пары «ключ — значение» на каждую итерацию.
О словаре и других типах данных Python можно почитать в нашей статье.
Ключи словаря
Как мы знаем, числа и строки являются неизменяемыми, поэтому если мы попытаемся изменить данные объекты через переменные a и b то это на самом деле приведет к тому что появятся новые объекты:
Как видите, число \(1\) и строка ‘ABC’ оказались не просто неизменяемыми, но еще и хешируемыми. Да, кортежи относятся к неизменяемому типу данных, но только до той поры, пока они сами состоят из неизменяемых объектов, например:
Мы не можем менять кортежи так же как мы меняем списки, т.е. что бы изменить кортеж (1, 2, 3) на (111, 2, 3) нам придется создать новый объект:
Но что, если одним из элементов кортежа является изменяемый объект? Давайте проверим:
Оказывается, кортежи невсегда являются неизменяемыми, а значит они и невсегда являются хешируемыми:
Следовательно и ключами значений словаря они так же могут быть только в том случае, если сами состоят из неизменяемых элементов:
Еще, на всякий пожарный, следует отметить что в качестве ключей элементов не стоит использовать числа типа float, так как из-за двоичной арифметики компьютера могут возникать некоторые неточности, например:
Но если попытаться выполнить следующую команду, то мы получим ошибку KeyError:
Дело в том что некоторые конечные десятичные дроби являются бесконечными в двоичном представлении, а из-за усечений возникают небольшие погрешности:
По той же самой причине не рекомендуется использовать в качестве ключей и комплексные числа. Но имейте в виду, что это всего лишь рекомендация, ведь прямое обращение по ключу a[0.3] прекрасно работает.
Словари Python
Python предоставляет еще один составной тип данных, называемый словарем, который похож на список в том, что представляет собой набор объектов….
Python предоставляет еще один составной тип данных, называемый словарем, который похож на список в том, что представляет собой набор объектов.
Вот что вы узнаете из этого руководства: вы узнаете об основных характеристиках словарей Python и то, как получить доступ к данным словаря и управлять ими. После того, как вы закончите это руководство, вы должны хорошо понимать, когда словарь является подходящим типом данных для использования и как это реализовать.
Словари и списки имеют следующие характеристики:
Словари отличаются от списков в первую очередь способом доступа к элементам:
Определение словаря
Словари – это реализация Python структуры данных, более известной как ассоциативный массив. Словарь состоит из набора пар ключ-значение. Каждая пара “ключ-значение” сопоставляет ключ с соответствующим значением.
Вы можете определить словарь, заключив список пар ключ-значение, разделенных запятыми, в фигурные скобки (<>). Двоеточие (:) отделяет каждый ключ от связанного с ним значения:
Следующее определяет словарь, который сопоставляет местоположение с названием соответствующей команды Высшей бейсбольной лиги:
Сопоставление местоположения словаря с командой MLB
MLB_team также можно определить следующим образом:
Если значения ключа являются простыми строками, их можно указать как аргументы ключевого слова. Итак, вот еще один способ определить MLB_team:
После того, как вы определили словарь, вы можете отобразить его содержимое так же, как и для списка. Все три приведенных выше определения при отображении выглядят следующим образом:
Записи в словаре отображаются в том порядке, в котором они были определены. Но когда дело доходит до их получения, это не имеет значения. Доступ к элементам словаря не осуществляется по числовому индексу:
Доступ к значениям словаря
Конечно, элементы словаря должны быть как-то доступны. Если вы не получите их по индексу, то как их получить?
Значение извлекается из словаря путем указания соответствующего ключа в квадратных скобках ([]):
Если вы ссылаетесь на ключ, которого нет в словаре, Python вызывает исключение:
Добавление записи в существующий словарь – это просто вопрос назначения нового ключа и значения:
Если вы хотите обновить запись, вы можете просто присвоить новое значение существующему ключу:
Чтобы удалить запись, используйте оператор del, указав ключ для удаления:
Беги, Сихокс! Ты команда НФЛ.
Ключи словаря и индексы списка
Вы могли заметить, что интерпретатор вызывает то же исключение, KeyError, когда к словарю обращаются либо с неопределенным ключом, либо по числовому индексу:
По сути, это та же ошибка. В последнем случае [1] выглядит как числовой индекс, но это не так.
Позже в этом руководстве вы увидите, что объект любого неизменяемого типа может использоваться как ключ словаря. Соответственно, нет причин, по которым вы не можете использовать целые числа:
В выражениях MLB_team [1], d [0] и d [2] числа в квадратных скобках выглядят так, как если бы они могли быть индексами. Но они не имеют ничего общего с порядком пунктов в словаре. Python интерпретирует их как ключи словаря. Если вы определите этот же словарь в обратном порядке, вы все равно получите те же значения, используя те же ключи:
Синтаксис может быть похожим, но словарь нельзя рассматривать как список:
Примечание. Хотя доступ к элементам в словаре не зависит от порядка, Python гарантирует, что порядок элементов в словаре сохраняется. При отображении элементы будут отображаться в том порядке, в котором они были определены, и повторение ключей также будет происходить в этом порядке. Элементы, добавленные в словарь, добавляются в конце. Если элементы удаляются, порядок остальных элементов сохраняется.
На такое сохранение порядка можно рассчитывать лишь совсем недавно. Он был добавлен как часть спецификации языка Python в версии 3.7. Однако это было верно и для версии 3.6 – случайно, в результате реализации, но не гарантированной спецификацией языка.
Постепенное создание словаря
Определение словаря с помощью фигурных скобок и списка пар ключ-значение, как показано выше, нормально, если вы заранее знаете все ключи и значения. Но что, если вы хотите создать словарь на лету?
Вы можете начать с создания пустого словаря, который определяется пустыми фигурными скобками. Затем вы можете добавлять новые ключи и значения по одному:
После создания словаря таким образом доступ к его значениям осуществляется так же, как и к любому другому словарю:
Для получения значений в подсписке или подсловаре требуется дополнительный индекс или ключ:
В этом примере демонстрируется еще одна особенность словарей: значения, содержащиеся в словаре, не обязательно должны быть одного типа. Лично некоторые значения являются строками, одно – целым числом, одно – списком, а третье – другим словарем.
Точно так же, как значения в словаре не обязательно должны быть одного типа, ключи также не должны:
Здесь один из ключей – целое число, один – число с плавающей запятой, а третий – логическое. Неизвестно, насколько это может быть полезно, но мало ли.
Обратите внимание, насколько универсальны словари Python. В MLB_team одна и та же информация (название бейсбольной команды) хранится для каждого из нескольких различных географических мест. person, с другой стороны, хранит различные типы данных для одного человека.
Вы можете использовать словари для самых разных целей, потому что существует очень мало ограничений на разрешенные ключи и значения. Но такие есть. Читай дальше!
Ограничения для ключей словаря
Почти любой тип значения может использоваться в качестве словарного ключа в Python. Вы только что видели этот пример, где в качестве ключей используются целочисленные, плавающие и логические объекты:
Вы даже можете использовать встроенные объекты, такие как типы и функции:
Однако есть пара ограничений, которым должны соответствовать словарные ключи.
Во-первых, данный ключ может появиться в словаре только один раз. Повторяющиеся ключи не допускаются. Словарь сопоставляет каждый ключ с соответствующим значением, поэтому нет смысла сопоставлять конкретный ключ более одного раза.
Вы видели выше, что когда вы присваиваете значение уже существующему ключу словаря, он не добавляет ключ во второй раз, а заменяет существующее значение:
Точно так же, если вы укажете ключ во второй раз во время первоначального создания словаря, второе вхождение заменит первое:
Прочь, Timberwolves! Вы команда НБА. Вроде, как бы, что-то вроде того.
Во-вторых, ключ словаря должен иметь неизменяемый тип. Вы уже видели примеры, в которых несколько знакомых вам неизменяемых типов – integer, float, string и Boolean – служили ключами словаря.
Кортеж также может быть ключом словаря, потому что кортежи неизменяемы:
(Вспомните из обсуждения кортежей, что одно из объяснений использования кортежа вместо списка заключается в том, что существуют обстоятельства, при которых требуется неизменяемый тип. Это одно из них.)
Однако ни список, ни другой словарь не могут служить ключом словаря, потому что списки и словари изменяемы:
Техническое примечание. Почему в сообщении об ошибке написано «unhashable»?
Технически не совсем правильно говорить, что объект должен быть неизменным, чтобы его можно было использовать в качестве словарного ключа. Точнее, объект должен быть хешируемым, что означает, что его можно передать хеш-функции. Хэш-функция принимает данные произвольного размера и сопоставляет их с относительно более простым значением фиксированного размера, называемым хеш-значением (или просто хешем), которое используется для поиска и сравнения в таблице.
Встроенная функция Python hash() возвращает хеш-значение для объекта, который можно хэшировать, и вызывает исключение для объекта, который не является:
Все встроенные неизменяемые типы, о которых вы уже узнали, являются хешируемыми, а изменяемые типы контейнеров (списки и словари) – нет. Итак, для настоящих целей вы можете думать о хэшируемом и неизменяемом как о более или менее синонимах.
В будущих уроках вы встретите изменяемые объекты, которые также могут быть хешированы.
Ограничения на значения словаря
Напротив, нет ограничений на значения словаря. Буквально совсем нет. Значением словаря может быть любой тип объекта, поддерживаемый Python, включая изменяемые типы, такие как списки и словари, а также определяемые пользователем объекты, о которых вы узнаете в следующих руководствах.
Также нет ограничений на то, чтобы определенное значение появлялось в словаре несколько раз:
Операторы и встроенные функции
Вы уже познакомились со многими операторами и встроенными функциями, которые можно использовать со строками, списками и кортежами. Некоторые из них также работают со словарями.
Например, операторы in и not in возвращают True или False в зависимости от того, встречается ли указанный операнд как ключ в словаре:
Вы можете использовать оператор in вместе с оценкой короткого замыкания, чтобы избежать появления ошибки при попытке доступа к ключу, которого нет в словаре:
Во втором случае из-за оценки короткого замыкания выражение MLB_team[‘Toronto’] не оценивается, поэтому исключение KeyError не возникает.
Функция len() возвращает количество пар ключ-значение в словаре:
Встроенные словарные методы
Как и в случае со строками и списками, есть несколько встроенных методов, которые можно вызывать в словарях. Фактически, в некоторых случаях методы списка и словаря имеют одно и то же имя. (При обсуждении объектно-ориентированного программирования вы увидите, что для разных типов вполне приемлемо иметь методы с одинаковыми именами.)
Ниже приводится обзор методов, применимых к словарям:
d.clear()
d.clear() очищает словарь d от всех пар ключ-значение:
Возвращает значение ключа, если он существует в словаре.
d.get( ) ищет в словаре d и возвращает связанное значение, если оно найдено. Если не найден, возвращается None:
d.items()
Возвращает список пар ключ-значение в словаре.
d.items() возвращает список кортежей, содержащих пары ключ-значение в d. Первый элемент в каждом кортеже – это ключ, а второй элемент – значение ключа:
d.keys()
Возвращает список ключей в словаре.
d.keys() возвращает список всех ключей в d:
d.values()
Возвращает список значений в словаре.
d.values() возвращает список всех значений в d:
Любые повторяющиеся значения в d будут возвращаться столько раз, сколько они встречаются:
Удаляет ключ из словаря, если он присутствует, и возвращает его значение.
Если присутствует в d, d.pop ( ) удаляет и возвращает связанное с ним значение:
d.pop( ) вызывает исключение KeyError, если не находится в d:
d.popitem()
Удаляет пару ключ-значение из словаря
d.popitem() удаляет последнюю пару ключ-значение, добавленную из d, и возвращает ее как кортеж:
Если в d пусто, d.popitem() вызывает исключение KeyError:
Примечание. В версиях Python менее 3.6 popitem () будет возвращать произвольную (случайную) пару ключ-значение, поскольку словари Python были неупорядоченными до версии 3.6.
d.update( )
Объединяет словарь с другим словарем или с итерацией пар ключ-значение.
Если – словарь, d.update( ) объединяет записи из в d. Для каждого ключа в :
Вот пример объединения двух словарей:
В этом примере ключ ‘b’ уже существует в d1, поэтому его значение обновляется до 200, значение для этого ключа из d2. Однако в d1 нет ключа ‘d’, поэтому эта пара “ключ-значение” добавляется из d2.
также может быть последовательностью пар ключ-значение, подобно тому, как функция dict() используется для определения словаря. Например, можно указать как список кортежей:
Или значения для объединения можно указать в виде списка аргументов ключевого слова:
Вывод
В этом руководстве вы рассмотрели основные свойства словаря Python и узнали, как получить доступ к данным словаря и управлять ими.
Списки и словари – два наиболее часто используемых типа Python. Как вы видели, они имеют несколько общих черт, но отличаются способом доступа к их элементам. Доступ к элементам списков осуществляется по числовому индексу в зависимости от порядка, а к элементам словаря – по ключу
Из-за этой разницы списки и словари подходят для разных ситуаций. Теперь вы должны хорошо почувствовать, что лучше всего подходит для данной ситуации.
Словари в Python
Содержание страницы: |
---|
1.1. Создание словаря на Python |
1.2. Обращение к значению, связанному с ключом в словаре |
1.3. Добавление новых пар «ключ-значение» |
1.4. Удаление пар «ключ-значение» |
1.5. Обращение к значениям методом get() |
1.6. Проверка наличия заданного ключа в словаре |
2.1. Перебор пар «ключ-значение» методом items() |
2.2. Перебор всех ключей в словаре методом keys() |
2.3. Перебор всех значений в словаре метод values() |
3. Список словарей в Python |
4. Список в словаре Python |
5. Словарь в словаре Python |
1.1. Создание словаря на Python.
Для создания словаря заключите в фигурные скобки <> список пар «ключ-значение», разделенных запятыми, в форме ключ: значение. Значением может быть число, список, строка и даже другой словарь. В примере ниже хранится информация об одном автомобиле.
В данном примере ключом является ‘марка’, а значение ‘bmw’. Затем через запятую идет следующая пара ключ-значение и так далее. Если вы укажете ключ, то Python вернет значение, связанное с этим ключом. Ключ от значения всегда отделяется двоеточием.
В данном примере возвращается значения связанных с ключом в словаре с помощью f-строк строится сообщение.
1.3. Добавление новых пар «ключ-значение»
В словарь в любой момент можно добавлять новые пары «ключ-значение». Для этого укажите имя словаря, затем в квадратных скобках новый ключ и с помощью команды присваивания укажите значение. Добавим в словарь автомобиля его цвет.
В итоге мы получили в словаре новую пару «ключ-значение» ‘цвет’: ‘белый’. Таким образом можно добавлять неограниченное количество пар.
1.4. Удаление пар «ключ-значение»
>>> car_1. pop (‘mileage’)
58135
>>> print (car_1)
>>> car_1 = <'brand': 'bmw', 'type': 'седан', 'mileage': 58135>
>>> color = car_1. get (‘color’, ‘Такого ключа не существует’)
>>> print (color)
Такого ключа не существует
В результате вместо ошибки, мы получили сообщение о отсутствие ключа в словаре.
1.6. Проверка наличия заданного ключа в словаре Python.
Чтобы проверить содержит ли словарь заданный ключ, можно воспользоваться оператором in или not in :
>>> car_1 = <'brand': 'bmw', 'type': 'седан', 'mileage': 58135>
>>> ‘type’ in car_1
True
>>> ‘color’ in car_1
False
>>> ‘color’ not in car_1
True
В начале в цикле for Python перебирает все пары «ключ-значение» в словаре. В процессе перебора ключ сохраняется в переменной month, а значение в переменной days. Затем создается условие, если количество дней четное, то выводится команда print с названием месяца и количества дней с окончанием «дней». Если количество не чётное, то пишется «день».
Метод keys() удобен если вы собираетесь работать с ключами в словаре. Переберем словарь и выведем все ключи в нем:
В Python перебор ключей используется по умолчанию при переборе словаря. Две записи ниже дают один и тот же результат.
Явный вызов метода keys() может упростить чтение вашего кода.
>>> for key in sorted( year.keys() ) :
. print (key)
.
апрель
март
февраль
январь
В результате ключи сортируются по алфавиту.
3. Список словарей в Python.
В Python можно сохранить множество словарей в списки или список сделать значением элемента словаря. Создание таких сложных структур называется вложениями. Можно вложить не ограниченное количество словарей в список.
Далее создаем пустой список и добавляем в него словари.
В результате Python перебирает список и проверяет условия, если в паре ключ: значение появляется автомобиль Bmw, то для него меняются элементы, для всех остальных ничего не изменяется.
4. Список в словаре Python.
В словарь Python можно также поместить список. Например, есть словарь с опросами посетителей на сайте, какая марка автомобиля им больше нравится. У одного человека может быть несколько ответов, как раз их можно поместить в список.
Alex любит автомобили марки:
Bmw
Audi
Mersedes
Artem любит автомобили марки:
Audi
Phil любит автомобили марки:
Ford
Porshe
Jon любит автомобили марки:
Lada
В процессе перебора словаря имя сохраняется в переменной name, а список в переменную cars. Выводим сообщение с помощью f-строки с именем опрашиваемого, затем с помощью цикла for перебираем элементы списка и выводим названия брендов с новой строки.
5. Словарь в словаре Python
Словарь тоже можно вложить в словарь. Например, словарь с пользователями на сайте. У каждого пользователя хранится информация о нем имя и фамилия.
Ваш логин: qwerty
Добро пожаловать на сайт John Brut!
Ваш логин: fill
Добро пожаловать на сайт Philip Ivanov!
Словари
«Неупорядоченный» – значит, что последовательность расположения пар не важна, в следствие чего обращение к элементам по индексам невозможно.
В других языках структуры, схожие со словарями, называются по-другому. Например, в Java подобный тип данных называется отображением.
Чтобы представление о словаре стало более понятным, проведем аналогию с обычным словарем, например, англо-русским. На каждое английское слово в таком словаре есть русское слово-перевод: cat – кошка, dog – собака, table – стол и т. д. Если англо-русский словарь описать с помощью Python, то английские слова можно сделать ключами, а русские – их значениями:
Обратите внимание на фигурные скобки, именно с их помощью определяется словарь. Синтаксис словаря на Питоне описывается такой схемой:
В словаре доступ к значениям осуществляется не по индексам, а по ключам, которые заключаются в квадратные скобки (по аналогии с индексами списков):
В словаре не может быть двух элементов с одинаковыми ключами. Однако могут быть одинаковые значения у разных ключей.
Ключом может быть любой неизменяемый тип данных. Значением – любой тип данных. Значения словарей вполне могут быть структурами, например, другими словарями или списками.
Перебор элементов словаря в цикле for
Элементы словаря перебираются в цикле for также, как элементы других сложных объектов. Однако «по-умолчанию» извлекаются только ключи:
Но по ключам всегда можно получить значения:
В цикле for можно распаковывать кортежи, таким образом сразу извлекая как ключ, так и его значение:
Методы словаря keys() и values() позволяют получить отдельно перечни ключей и значений. Так что если, например, надо перебрать только значения или только ключи, лучше воспользоваться одним из этих методов:
Методы словаря
Метод clear() удаляет все элементы словаря, но не удаляет сам словарь. В итоге остается пустой словарь:
Словарь – это изменяемый тип данных. Следовательно, как и список он передается в функцию по ссылке. Поэтому иногда, чтобы избежать нежелательного изменения глобального словаря его копируют. Это делают и с другими целями.
Метод get() позволяет получить элемент по его ключу:
Метод pop() удаляет из словаря элемент по указанному ключу и возвращает значение удаленной пары. Метод popitem() не принимает аргументов, удаляет и возвращает произвольный элемент.
С помощью setdefault() можно добавить элемент в словарь:
С помощью update() можно добавить в словарь другой словарь:
Также метод обновляет значения существующих ключей. Включает еще ряд особенностей.
Практическая работа
Примеры решения и дополнительные уроки в android-приложении и pdf-версии курса