Как сделать словарь в питоне
Словари. Основные понятия. Характеристики. Создание словарей. Доступ к значениям в словаре
Содержание
- 1. Особенности словарей. Преимущества применения
- 2. Отличия между словарями и списками
- 3. Операции и методы обработки словарей. Перечень
- 4. Особенности представления ключей числовыми типами
- 5. Какие значения не могут использоваться в качестве ключей?
- 6. Какие существуют способы создания словаря?
- 7. Создание словаря с помощью оператора присваивания = . Примеры
- 8. Создание словаря с помощью конструктора dict() . Пример
- 9. Каким образом осуществляется доступ к значению по его ключу?
- 10. Примеры избежания ошибок доступа по несуществующему ключу
- 11. Примеры вложенных словарей
Поиск на других ресурсах:
1. Особенности словарей. Преимущества применения
В языке Python существует возможность использовать словари. Словари – это встроенный тип данных, который является ассоциативным массивом или хешем и базируется на отображении пар типа (ключ:значение).
Преимущества применения словарей:
- с помощью словарей можно разрабатывать эффективные структуры данных;
- для словарей не нужно писать вручную алгоритмы поиска данных, поскольку эти операции уже реализованы;
- словари могут содержать объединенные данные в виде записей;
- словари эффективны при представлении разреженных структур данных.
Основные характеристики словарей следующие:
- в словарях доступ к элементам выполняется по ключу, а не по индексу. Словари определяют взаимосвязь пар ключ:значение. По ключу происходит доступ к значению. Если в словаре реализовывать доступ к значению по индексу, то в этом случае индекс представляет собой ключ, а не смещение относительно начала;
- словари представляют неупорядоченные коллекции произвольных объектов. В словарях элементы (ключи) сохраняются в неопределенном порядке. Порядок формирования элементов в словаре определяет интерпретатор. Это необходимо для обеспечения более быстрого поиска.
- словари имеют переменную длину. Количество элементов в словаре может увеличиваться или уменьшаться;
- гетерогенность – словари могут содержать объекты любых типов;
- произвольное количество вложений – словари имеют возможность создания произвольного количества уровней вложений, поскольку словари могут содержать списки, другие словари и т.п.;
- словари относятся к категории изменяемых объектов. Поэтому, в словарях нет смысла использовать операции которые имеют фиксированный порядок следования элементов (например, конкатенация);
- словари являются таблицами ссылок на объекты или хеш-таблицами и относятся к отображаемым объектам. Это означает, что в словарях объекты отображают (представляют) ключи на значение.
2. Отличия между словарями и списками
Между словарями и списками существуют следующие основные отличия:
- списки являются упорядоченными коллекциями, словари не являются упорядоченными коллекциями;
- в списках элементы извлекаются с помощью смещения, которое определяет позицию элемента в списке. В словарях элементы вытягиваются с помощью ключа;
- в отличие от списков, в словарях нет поддержки операций над последовательностями (например, конкатенация, получение среза и прочее);
- списки являются массивами ссылок на объекты. Словари являются массивами неупорядоченных таблиц ссылок на объекты, поддерживающим доступ к объектам по ключу.
3. Операции и методы обработки словарей. Перечень
В языке Python существует огромное разнообразие операций и методов для обработки словарей. Все эти средства вкратце перечислены здесь:
- стандартный метод len() – определяет количество элементов в списке;
- операция DКак сделать словарь в питоне – доступ к элементу словаря D по значению ключа key ;
- операция del – удаление элемента по ключу;
- операции in , not in – определения наличия или отсутствия ключа в словаре;
- метод iter() – получить итератор по ключам словаря;
- метод clear() – удалить все элементи из словаря;
- метод copy() – вернуть копию словаря;
- метод dict.fromkeys() – создать новый словарь из ключей и значений;
- метод get() – получить значение по ключу;
- метод items() – вернуть представление элементов словаря;
- метод keys() – получить новое представление ключей словаря;
- метод pop() – удаление элементов из словаря с возвратом значения;
- метод popitem() – вытягивание из словаря произвольной пары ключ:значение;
- метод setdefault() – установить элемент по умолчанию;
- метод update() – обновление словаря по заданному списку пар ключ:значение;
- метод values() – получить список значений из словаря.
Более подробно использование вышеперечисленных операций и методов можно изучить в темах:
4. Особенности представления ключей числовыми типами
В словарях, в качестве ключей могут использоваться числовые типы: целый или вещественный (с плавающей запятой). В случае представления ключей числовыми типами можно выделить следующие особенности:
- при поиске нужного значения по ключу используется простая операция сравнения. Если в качестве ключа указывать значение разных числовых типов, например 1 и 1.0, то такие значения считаются взаимозаменяемыми (обращаются к одному и тому же элементу словаря);
- представление ключа числовым типом с плавающей запятой не рекомендуется, поскольку значение этих типов есть приближенными. Если в качестве ключа нужно указать числовой тип, то для этого целесообразно использовать целые числовые типы.
5. Какие значения не могут использоваться в качестве ключей?
В качестве ключей нельзя использовать изменяемые типы объектов. Например, списки, словари и прочие изменяемые типы не могут использоваться в качестве ключей. Однако, в качестве значений эти изменяемые типы можно использовать.
6. Какие существуют способы создания словаря?
В языке Python, чтобы создать словарь можно использовать один из следующих способов:
- с помощью оператора присваивания = и фигурных скобок, в которых через запятую размещаются пары ключ:значение;
- с помощью конструктора dict() класса dict .
7. Создание словаря с помощью оператора присваивания = . Примеры
Словарь можно создать удобным (естественном) способом с помощью оператора присваивания = .
Результат выполнения программы
8. Создание словаря с помощью конструктора dict() . Пример
Словарь может быть создан с помощью одного из конструкторов dict() , которые реализованы в классе dict . В соответствии с документацией Python в классе dict используется 3 конструктора, которые имеют следующую общую форму
- keyword_arg – необязательный ключевой аргумент. Если конструктор вызывается без ключевого аргумента (например, dict() ), то создается пустой словарь. Если в конструкторе задается несколько ключевых аргументов, то они разделяются запятой (в общей форме конструктора использованы символы **);
- mapping – отображаемый объект, на основе которого создается словарь;
- iterable – итерированный объект, на основе которого создается словарь.
В зависимости от аргументов, интерпретатор Python вызывает соответствующий конструктор. Во всех конструкторах первый объект каждого элемента становится ключом, второй становится соответствующим значением.
В случае, если ключ встречается больше одного раза, то принимается последнее значение, установленное по этому ключу.
Пример. Демонстрируется создание словарей разными способами.
Результат выполнения программы
9. Каким образом осуществляется доступ к значению по его ключу?
В словаре, если известен ключ, то доступ к значению по эту ключу можно получить с помощью операции [] . В этот же способ можно изменить значение, если известен ключ, который соответствует этому значению.
Например.
10. Примеры избежания ошибок доступа по несуществующему ключу
При работе со словарями, возможна ситуация, когда происходит доступ по ключу, которого нет в словаре. В этом случае в программе возникает ошибка и генерируется исключение KeyError .
Чтобы избежать ошибки доступа по несуществующемоу ключу можно использовать один из трех способов:
- предварительно проверить наличие ключа с помощью конструкции if;
- использовать блок try-except для обработки исключения KeyError ;
- использовать метод get() , который, в случае несуществующего ключа, возвращает значение по умолчанию.
В примере демонстрируются все три способа.
Пример.
11. Примеры вложенных словарей
В качестве значений словари могут содержать другие вложенные словари. Например:
Обычные списки (массивы) представляют собой набор пронумерованных элементов, то есть для обращения к какому-либо элементу списка необходимо указать его номер. Номер элемента в списке однозначно идентифицирует сам элемент. Но идентифицировать данные по числовым номерам не всегда оказывается удобно. Например, маршруты поездов в России идентифицируются численно-буквенным кодом (число и одна буква), также численно-буквенным кодом идентифицируются авиарейсы, то есть для хранения информации о рейсах поездов или самолетов в качестве идентификатора удобно было бы использовать не число, а текстовую строку.
Структура данных, позволяющая идентифицировать ее элементы не по числовому индексу, а по произвольному, называется словарем или ассоциативным массивом. Соответствующая структура данных в языке Питон называется dict .
Рассмотрим простой пример использования словаря. Заведем словарь Capitals , где индексом является название страны, а значением — название столицы этой страны. Это позволит легко определять по строке с названием страны ее столицу.
Итак, каждый элемент словаря состоит из двух объектов: ключа и значения. В нашем примере ключом является название страны, значением является название столицы. Ключ идентифицирует элемент словаря, значение является данными, которые соответствуют данному ключу. Значения ключей — уникальны, двух одинаковых ключей в словаре быть не может.
В жизни широко распространены словари, например, привычные бумажные словари (толковые, орфографические, лингвистические). В них ключом является слово-заголовок статьи, а значением — сама статья. Для того, чтобы получить доступ к статье, необходимо указать слово-ключ.
Другой пример словаря, как структуры данных — телефонный справочник. В нем ключом является имя, а значением — номер телефона. И словарь, и телефонный справочник хранятся так, что легко найти элемент словаря по известному ключу (например, если записи хранятся в алфавитном порядке ключей, то легко можно найти известный ключ, например, бинарным поиском), но если ключ неизвествен, а известно лишь значение, то поиск элемента с данным значением может потребовать последовательного просмотра всех элементов словаря.
Особенностью ассоциативного массива является его динамичность: в него можно добавлять новые элементы с произвольными ключами и удалять уже существующие элементы. При этом размер используемой памяти пропорционален размеру ассоциативного массива. Доступ к элементам ассоциативного массива выполняется хоть и медленнее, чем к обычным массивам, но в целом довольно быстро.
В языке Питон ключом может быть произвольный неизменяемый тип данных: целые и действительные числа, строки, кортежи. Ключом в словаре не может быть множество, но может быть элемент типа frozenset : специальный тип данных, являющийся аналогом типа set , который нельзя изменять после создания. Значением элемента словаря может быть любой тип данных, в том числе и изменяемый.
Когда нужно использовать словари
- Подсчет числа каких-то объектов. В этом случае нужно завести словарь, в котором ключами являются объекты, а значениями — их количество.
- Хранение каких-либо данных, связанных с объектом. Ключи — объекты, значения — связанные с ними данные. Например, если нужно по названию месяца определить его порядковый номер, то это можно сделать при помощи словаря Num['January'] = 1; Num['February'] = 2; . .
- Установка соответствия между объектами (например, “родитель—потомок”). Ключ — объект, значение — соответствующий ему объект.
- Если нужен обычный массив, но масимальное значение индекса элемента очень велико, и при этом будут использоваться не все возможные индексы (так называемый “разреженный массив”), то можно использовать ассоциативный массив для экономии памяти.
Создание словаря
Пустой словарь можно создать при помощи функции dict() или пустой пары фигурных скобок <> (вот почему фигурные скобки нельзя использовать для создания пустого множества). Для создания словаря с некоторым набором начальных значений можно использовать следующие конструкции:
Первые два способа можно использовать только для создания небольших словарей, перечисляя все их элементы. Кроме того, во втором способе ключи передаются как именованные параметры функции dict , поэтому в этом случае ключи могут быть только строками, причем являющимися корректными идентификаторами. В третьем и четвертом случае можно создавать большие словари, если в качестве аргументов передавать уже готовые списки, которые могут быть получены не обязательно перечислением всех элементов, а любым другим способом построены по ходу исполнения программы. В третьем способе функции dict нужно передать список, каждый элемент которого является кортежем из двух элементов: ключа и значения. В четвертом способе используется функция zip , которой передаются два списка одинаковой длины: список ключей и список значений.
Работа с элементами словаря
Основная операция: получение значения элемента по ключу, записывается так же, как и для списков: AКак сделать словарь в питоне . Если элемента с заданным ключом нет в словаре, то возникает исключение KeyError .
Другой способ определения значения по ключу — метод get : A.get(key) . Если элемента с ключом get нет в словаре, то возвращается значение None . В форме записи с двумя аргументами A.get(key, val) метод возвращает значение val , если элемент с ключом key отсутствует в словаре.
Проверить принадлежность элемента словарю можно операциями in и not in , как и для множеств.
Для добавления нового элемента в словарь нужно просто присвоить ему какое-то значение: AКак сделать словарь в питоне = value .
Для удаления элемента из словаря можно использовать операцию del AКак сделать словарь в питоне (операция возбуждает исключение KeyError , если такого ключа в словаре нет. Вот два безопасных способа удаления элемента из словаря.
В первом случае мы предварительно проверяем наличие элемента, а во втором - перехватываем и обрабатываем исключение.
Еще один способ удалить элемент из словаря: использование метода pop : A.pop(key) . Этот метод возвращает значение удаляемого элемента, если элемент с данным ключом отсутствует в словаре, то возбуждается исключение. Если методу pop передать второй параметр, то если элемент в словаре отсутствует, то метод pop возвратит значение этого параметра. Это позволяет проще всего организовать безопасное удаление элемента из словаря: A.pop(key, None) .
Перебор элементов словаря
Можно легко организовать перебор ключей всех элементов в словаре:
Следующие методы возвращают представления элементов словаря. Представления во многом похожи на множества, но они изменяются, если менять значения элементов словаря. Метод keys возвращает представление ключей всех элементов, метод values возвращает представление всех значений, а метод items возвращает представление всех пар (кортежей) из ключей и значений.
При работе с Python все время нужно временно хранить данные для их последующей обработки в соответствующей структуре данных. Язык предоставляет для этого специальную структуру данных — Python словари . В них можно получить доступ к фрагменту данных или значений с помощью ключа ( слова ), который у нас есть.
В этом руководстве мы рассмотрим следующие темы:
- как создать словарь, используя фигурные скобки и двоеточия;
- как загрузить данные в словарь с помощью библиотек urllib и random ;
- как фильтровать словарь с помощью цикла for и специальных итераторов для перебора ключей и значений словаря;
- как выполнять операции со словарем для получения или удаления значений, и как использовать значения словаря для подмножества значений из него;
- как сортировать словарь с помощью библиотеки re и как в этом могут помочь функции OrderedDict и лямбда-функции;
- сравним словари Python со списками, массивами NumPy и Pandas DataFrames .
Как создать словарь в Python
Словари можно распознать по фигурным скобкам <> и разделению двоеточием : ключа и значения для каждого элемента.
Переменная fruit в приведенном ниже коде является допустимым словарем. Получить доступ к элементу Python словаря можно, поместив ключ между квадратными скобками [] .Также можно использовать метод .get() , чтобы сделать то же самое:
Как добавить данные в словарь Python?
Теперь мы поместим данные во вложенный словарь, который содержит в качестве значения другой словарь, а не строку или целое число. Таким образом, в словарь можно сохранять таблицы или матрицы.
Используемые данные — это отзывы на Amazon о книге Донны Тартт « The Goldfinch «. Они были сохранены в простом файле с разделителями. Таблица содержит четыре столбца: оценка, URL-адрес , заголовок отзыва и текст отзыва.
Есть несколько способов представить эти данные в Python словаре, но в нашем случае мы берем URL-адрес в качестве ключа и помещаем другие столбцы в словарь с вложенными значениями:
Мы получили набор данных, в котором нет отсутствующих значений. Но можно проверить, присутствуют ли все ключи в словаре, сравнив количество строк из файла с количеством ключей словаря. В нашем случае сортировка словаря Python осуществляется следующим образом:
Как отфильтровать словарь Python
Теперь, когда отзывы хранятся в словаре, пришло время попробовать выполнить некоторые операции. Допустим, вы хотите посмотреть, что на самом деле написали люди, выбрав только отзывы с оценкой 1.0 .
Оценки хранятся в значениях словаря, поэтому придется перебирать словарь. Для этого можно использовать цикл for .
Элементы словаря Python имеют не только ключ и значение, но и специальный итератор для их перебора. Вместо for item in dictionary необходимо использовать for key , value in dictionary.items() . При этом должны использоваться две переменные, ключ и значение, а не одна.
Существуют отдельные итераторы для ключей (.keys()) и значений (.values()) .
Мы сохраняем ключи отзывов с низкой оценкой в списке с именем lowscores . Благодаря этому в дальнейшем можно будет повторно использовать список, чтобы извлечь отзывы из словаря:
Операции над словарями Python
Если словарь, содержащий полный набор данных, большой, то разумнее использовать список lowscores , который мы только что скомпилировали, чтобы создать совершенно новый словарь ( Python список в словарь ). Преимущество этого приема заключается в том, что для дальнейшего анализа не нужно хранить в памяти большой словарь. Можно просто перейти к соответствующему подмножеству исходных данных.
Во-первых, мы используем ключи, хранящиеся в lowscores , для создания нового словаря. Чтобы сделать это, есть два способа: первый — извлекаем только соответствующие элементы из исходного словаря с помощью метода .get() , оставляя исходный словарь без изменений. Второй — использовать метод .pop() , который удаляет извлеченные записи из исходного словаря.
Вы можете сравнить традиционный стиль с использованием цикла и генерацию словаря и убедиться, что они действительно дают идентичный результат:
Чтобы упростить код, мы создаем в отдельной строке новый вложенный словарь как новый объект newvalues . После чего заполняем scoredict идентификаторами в качестве ключей и объектами из словаря newvalues в качестве значений:
Как происходит сортировка словаря Python?
Мы попробовали загрузить в словарь реальный набор данных, теперь можно выполнить их простой анализ. Если вы хотите знать, что именно пишут люди, ставящие низкую оценку роману, можно провести сортировку словаря Python , создав список частоты использования слов в отрицательных отзывах ( оценка 1.0 ).
Python содержит встроенную функцию для удаления заглавных букв из слов, нужно просто привязать функцию .lowercase() к строке. Таким образом, можно избавиться от слов, начинающихся с заглавной буквы, которые встречаются в начале предложений.
Если вы не используете defaultdict , Python может выдать ошибку при первом увеличении частоты ( с 0 до 1 ), потому что ключ еще не существует. Этого можно избежать, предварительно проверив, существует ли ключ в Python словаре, прежде чем увеличивать значение его частоты. Но это решение не такое элегантное, как defaultdict :
После того, как наш частотный словарь будет готов, все равно нужно будет осуществить сортировку словаря Python по значению в порядке убывания, чтобы быстро увидеть, какие слова употребляются чаще всего. Поскольку стандартные словари ( в том числе defaultdict ) не могут быть отсортированы определенным образом, нужно использовать другой класс, а именно OrderedDict . Он хранит элементы словаря в порядке их добавления. В этом случае сначала нужно отсортировать элементы, прежде чем сохранять их снова в класс OrderedDict .
Функция sorted принимает три аргумента. Первый — это объект, который нужно отсортировать, наш частотный словарь. При этом необходимо помнить, что доступ к парам ключ-значение в словаре возможен только через функцию .items() . Если вы забудете об этом, Python даже не выдаст предупреждение, а только вернет первый ключ, который встретит. Другими словами: если вы перебираете словарь, и ваш код ведет себя странным образом, проверьте, добавлена ли функция .items() .
Второй аргумент указывает, какую часть первого аргумента следует использовать для сортировки: key=lambda item: item[1] . Но вам придется более углубленно изучить язык Python , чтобы понять, что это такое. Первая часть довольно понятна: вы хотите, чтобы ключи сортировались.
Но что там делает lambda ? Она является анонимной функцией, то есть это функция без имени, которая не может быть вызвана извне. Это альтернативный способ обработки через цикл целого ряда объектов с помощью одной функции. В данном случае используется значение словаря ( item[1] , при item[0] выступающем в качестве ключа ) в качестве аргумента для сортировки.
Третий ( последний ) аргумент, reverse , указывает, должна ли сортировка выполняться по возрастанию ( по умолчанию ) или по убыванию. В данном случае мы хотим увидеть наиболее часто встречающиеся слова вверху и указываем reverse=True .
Можно поэкспериментировать и посмотреть, в каких частях Python словаря можно найти интересные слова:
Сравнение словарей со списками Python, массивами NumPy и Pandas DataFrames
Словари — важная структура данных Python , позволяющая поместить данные в объекты для дальнейшей обработки. Они, наряду со списками и кортежами, являются одной из основных, наиболее мощных и гибких структур данных Python . Но в последнее время большая часть функциональных возможностей словаря может быть заменена и заменяется Pandas , библиотекой анализа данных Python . Она позволяет лучше обрабатывать и анализировать данные на Python , и при этом не нужно использовать сторонние специализированные языки статистического программирования ( в частности, R ).
Такие библиотеки, как Pandas , позволяют обработчикам данных работать быстрее и эффективнее. Им больше не нужно беспокоиться о деталях более низкого уровня, касающихся того, как хранятся данные. Но Pandas также использует словари ( наряду с другими расширенными структурами данных, такими как массив NumPy ) для хранения данных.
Даже при применении Pandas иногда рекомендуется использовать словари. Например, когда значения необходимо просто сопоставить, и вам не нужны функции Pandas ни для чего другого. Использование объекта Pandas в таких случаях просто неэффективно и излишне.
Pandas включает в себя функции для преобразования словаря в Pandas DataFrame , и наоборот, а DataFrame может осуществлять Python сортировку словаря. Оба они действительно являются полезными частями современного инструментария.
Пожалуйста, оставляйте ваши мнения по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, лайки, подписки!
Дайте знать, что вы думаете по этой теме статьи в комментариях. Мы крайне благодарны вам за ваши комментарии, лайки, отклики, дизлайки, подписки!
Пожалуйста, оставьте ваши мнения по текущей теме материала. За комментарии, подписки, дизлайки, лайки, отклики огромное вам спасибо!
Python предоставляет еще один составной тип данных, называемый словарем, который похож на список в том, что представляет собой набор объектов….
Python предоставляет еще один составной тип данных, называемый словарем, который похож на список в том, что представляет собой набор объектов.
Вот что вы узнаете из этого руководства: вы узнаете об основных характеристиках словарей Python и то, как получить доступ к данным словаря и управлять ими. После того, как вы закончите это руководство, вы должны хорошо понимать, когда словарь является подходящим типом данных для использования и как это реализовать.
Словари и списки имеют следующие характеристики:
- Оба непостоянны.
- Оба динамичны. Они могут увеличиваться и уменьшаться по мере необходимости.
- Оба могут быть вложенными. Список может содержать другой список. Словарь может содержать другой словарь. Словарь также может содержать список, и наоборот.
Словари отличаются от списков в первую очередь способом доступа к элементам:
- Доступ к элементам списка осуществляется по их положению в списке посредством индексации.
- Доступ к элементам словаря осуществляется с помощью ключей.
Определение словаря
Словари – это реализация Python структуры данных, более известной как ассоциативный массив. Словарь состоит из набора пар ключ-значение. Каждая пара “ключ-значение” сопоставляет ключ с соответствующим значением.
Вы можете определить словарь, заключив список пар ключ-значение, разделенных запятыми, в фигурные скобки (<>). Двоеточие (:) отделяет каждый ключ от связанного с ним значения:
Следующее определяет словарь, который сопоставляет местоположение с названием соответствующей команды Высшей бейсбольной лиги:
Сопоставление местоположения словаря с командой MLB
Вы также можете создать словарь с помощью встроенной функции dict() . Аргумент dict() должен быть последовательностью пар ключ-значение. Для этого хорошо подходит список кортежей:
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 – служили ключами словаря.
Кортеж также может быть ключом словаря, потому что кортежи неизменяемы:
(Вспомните из обсуждения кортежей, что одно из объяснений использования кортежа вместо списка заключается в том, что существуют обстоятельства, при которых требуется неизменяемый тип. Это одно из них.)
Однако ни список, ни другой словарь не могут служить ключом словаря, потому что списки и словари изменяемы:
Технически не совсем правильно говорить, что объект должен быть неизменным, чтобы его можно было использовать в качестве словарного ключа. Точнее, объект должен быть хешируемым, что означает, что его можно передать хеш-функции. Хэш-функция принимает данные произвольного размера и сопоставляет их с относительно более простым значением фиксированного размера, называемым хеш-значением (или просто хешем), которое используется для поиска и сравнения в таблице.
Встроенная функция Python hash() возвращает хеш-значение для объекта, который можно хэшировать, и вызывает исключение для объекта, который не является:
Все встроенные неизменяемые типы, о которых вы уже узнали, являются хешируемыми, а изменяемые типы контейнеров (списки и словари) – нет. Итак, для настоящих целей вы можете думать о хэшируемом и неизменяемом как о более или менее синонимах.
В будущих уроках вы встретите изменяемые объекты, которые также могут быть хешированы.
Ограничения на значения словаря
Напротив, нет ограничений на значения словаря. Буквально совсем нет. Значением словаря может быть любой тип объекта, поддерживаемый Python, включая изменяемые типы, такие как списки и словари, а также определяемые пользователем объекты, о которых вы узнаете в следующих руководствах.
Также нет ограничений на то, чтобы определенное значение появлялось в словаре несколько раз:
Операторы и встроенные функции
Вы уже познакомились со многими операторами и встроенными функциями, которые можно использовать со строками, списками и кортежами. Некоторые из них также работают со словарями.
Например, операторы in и not in возвращают True или False в зависимости от того, встречается ли указанный операнд как ключ в словаре:
Вы можете использовать оператор in вместе с оценкой короткого замыкания, чтобы избежать появления ошибки при попытке доступа к ключу, которого нет в словаре:
Во втором случае из-за оценки короткого замыкания выражение MLB_team['Toronto'] не оценивается, поэтому исключение KeyError не возникает.
Функция len() возвращает количество пар ключ-значение в словаре:
Встроенные словарные методы
Как и в случае со строками и списками, есть несколько встроенных методов, которые можно вызывать в словарях. Фактически, в некоторых случаях методы списка и словаря имеют одно и то же имя. (При обсуждении объектно-ориентированного программирования вы увидите, что для разных типов вполне приемлемо иметь методы с одинаковыми именами.)
Ниже приводится обзор методов, применимых к словарям:
d.clear()
d.clear() очищает словарь d от всех пар ключ-значение:
Возвращает значение ключа, если он существует в словаре.
Метод Python dictionary .get() предоставляет удобный способ получения значения ключа из словаря без предварительной проверки существования ключа и без возникновения ошибки.
d.get( ) ищет в словаре d и возвращает связанное значение, если оно найдено. Если не найден, возвращается None:
Если не найден и указан необязательный аргумент , вместо None возвращается это значение:
d.items()
Возвращает список пар ключ-значение в словаре.
d.items() возвращает список кортежей, содержащих пары ключ-значение в d. Первый элемент в каждом кортеже – это ключ, а второй элемент – значение ключа:
d.keys()
Возвращает список ключей в словаре.
d.keys() возвращает список всех ключей в d:
d.values()
Возвращает список значений в словаре.
d.values() возвращает список всех значений в d:
Любые повторяющиеся значения в d будут возвращаться столько раз, сколько они встречаются:
Техническое примечание: методы .items() , .keys() и .values() на самом деле возвращают нечто, называемое объектом представления. Объект представления словаря более или менее похож на окно с ключами и значениями. Для практических целей эти методы можно рассматривать как возвращающие списки ключей и значений словаря.
Удаляет ключ из словаря, если он присутствует, и возвращает его значение.
Если присутствует в d, d.pop ( ) удаляет и возвращает связанное с ним значение:
d.pop( ) вызывает исключение KeyError, если не находится в d:
Если не находится в d, и указан необязательный аргумент , то возвращается это значение, и исключение не возникает:
d.popitem()
Удаляет пару ключ-значение из словаря
d.popitem() удаляет последнюю пару ключ-значение, добавленную из d, и возвращает ее как кортеж:
Если в d пусто, d.popitem() вызывает исключение KeyError:
Примечание. В версиях Python менее 3.6 popitem () будет возвращать произвольную (случайную) пару ключ-значение, поскольку словари Python были неупорядоченными до версии 3.6.
d.update( )
Объединяет словарь с другим словарем или с итерацией пар ключ-значение.
Если – словарь, d.update( ) объединяет записи из в d. Для каждого ключа в :
- Если ключ отсутствует в d, пара ключ-значение из добавляется к d.
- Если ключ уже присутствует в d, соответствующее значение в d для этого ключа обновляется до значения из .
Вот пример объединения двух словарей:
В этом примере ключ ‘b’ уже существует в d1, поэтому его значение обновляется до 200, значение для этого ключа из d2. Однако в d1 нет ключа ‘d’, поэтому эта пара “ключ-значение” добавляется из d2.
также может быть последовательностью пар ключ-значение, подобно тому, как функция dict() используется для определения словаря. Например, можно указать как список кортежей:
Или значения для объединения можно указать в виде списка аргументов ключевого слова:
Вывод
В этом руководстве вы рассмотрели основные свойства словаря Python и узнали, как получить доступ к данным словаря и управлять ими.
Списки и словари – два наиболее часто используемых типа Python. Как вы видели, они имеют несколько общих черт, но отличаются способом доступа к их элементам. Доступ к элементам списков осуществляется по числовому индексу в зависимости от порядка, а к элементам словаря – по ключу
Из-за этой разницы списки и словари подходят для разных ситуаций. Теперь вы должны хорошо почувствовать, что лучше всего подходит для данной ситуации.
Читайте также: