Интерактивный учебник языка Python
1. Словари
Обычные списки (массивы) представляют собой набор пронумерованных элементов, то есть для обращения к какому-либо элементу списка необходимо указать его номер. Номер элемента в списке однозначно идентифицирует сам элемент. Но идентифицировать данные по числовым номерам не всегда оказывается удобно. Например, маршруты поездов в России идентифицируются численно-буквенным кодом (число и одна буква), также численно-буквенным кодом идентифицируются авиарейсы, то есть для хранения информации о рейсах поездов или самолетов в качестве идентификатора удобно было бы использовать не число, а текстовую строку.
Структура данных, позволяющая идентифицировать ее элементы не по числовому индексу,
а по произвольному, называется словарем или ассоциативным массивом.
Соответствующая структура данных в языке Питон называется dict
.
Рассмотрим простой пример использования словаря. Заведем словарь Capitals
,
где индексом является название страны, а значением — название столицы этой страны.
# Создадим пустой словать Capitals Capitals = dict() # Заполним его несколькими значениями Capitals['Russia'] = 'Moscow' Capitals['Ukraine'] = 'Kiev' Capitals['USA'] = 'Washington' Countries = ['Russia', 'France', 'USA', 'Russia'] for country in Countries: # Для каждой страны из списка проверим, есть ли она в словаре Capitals if country in Capitals: print('Столица страны ' + country + ': ' + Capitals[country]) else: print('В базе нет страны c названием ' + country)
Итак, каждый элемент словаря состоит из двух объектов:
В жизни широко распространены словари, например, привычные бумажные словари (толковые, орфографические, лингвистические). В них ключом является слово-заголовок статьи, а значением — сама статья. Для того, чтобы получить доступ к статье, необходимо указать слово-ключ.
Другой пример словаря, как структуры данных — телефонный справочник. В нем ключом является имя, а значением — номер телефона. И словарь, и телефонный справочник хранятся так, что легко найти элемент словаря по известному ключу (например, если записи хранятся в алфавитном порядке ключей, то легко можно найти известный ключ, например, бинарным поиском), но если ключ неизвествен, а известно лишь значение, то поиск элемента с данным значением может потребовать последовательного просмотра всех элементов словаря.
Особенностью ассоциативного массива является его динамичность: в него можно добавлять новые элементы с произвольными ключами и удалять уже существующие элементы. При этом размер используемой памяти пропорционален размеру ассоциативного массива. Доступ к элементам ассоциативного массива выполняется хоть и медленнее, чем к обычным массивам, но в целом довольно быстро.
В языке Питон ключом может быть произвольный неизменяемый тип данных:
целые и действительные числа, строки, кортежи. Ключом в словаре не может
быть множество, но может быть элемент типа frozenset
: специальный
тип данных, являющийся аналогом типа set
, который нельзя изменять после создания.
Значением элемента словаря может быть любой тип данных, в том числе и изменяемый.
Когда нужно использовать словари
Словари нужно использовать в следующих случаях:
- Подсчет числа каких-то объектов. В этом случае нужно завести словарь, в котором ключами являются объекты, а значениями — их количество.
- Хранение каких-либо данных, связанных с объектом. Ключи —
объекты, значения — связанные с ними данные. Например, если нужно
по названию месяца определить его порядковый номер, то это можно сделать
при помощи словаря
Num['January'] = 1; Num['February'] = 2; ...
. - Установка соответствия между объектами (например, “родитель—потомок”). Ключ — объект, значение — соответствующий ему объект.
- Если нужен обычный массив, но масимальное значение индекса элемента очень велико, и при этом будут использоваться не все возможные индексы (так называемый “разреженный массив”), то можно использовать ассоциативный массив для экономии памяти.
Создание словаря
Пустой словарь можно создать при помощи функции dict()
или
пустой пары фигурных скобок {}
(вот почему фигурные скобки
нельзя использовать для создания пустого множества). Для создания словаря
с некоторым набором начальных значений можно использовать следующие конструкции:
Capitals = {'Russia': 'Moscow', 'Ukraine': 'Kiev', 'USA': 'Washington'} Capitals = dict(Russia = 'Moscow', Ukraine = 'Kiev', USA = 'Washington') Capitals = dict([("Russia", "Moscow"), ("Ukraine", "Kiev"), ("USA", "Washington")]) Capitals = dict(zip(["Russia", "Ukraine", "USA"], ["Moscow", "Kiev", "Washington"])) print(Capitals)
Первые два способа можно использовать только для создания небольших словарей, перечисляя все их элементы. Кроме того, во втором способе ключи передаются как именованные параметры функции dict
, поэтому
в этом случае ключи могут быть только строками, причем являющимися корректными идентификаторами.
В третьем и четвертом случае можно создавать большие словари, если в качестве аргументов
передавать уже готовые списки, которые могут быть получены не обязательно перечислением всех элементов,
а любым другим способом построены по ходу исполнения программы. В третьем способе
функции
нужно передать список, каждый элемент которого является кортежем
из двух элементов: ключа и значения. В четвертом способе используется функция zip
,
которой передаются два списка одинаковой длины: список ключей и список значений.
Работа с элементами словаря
Основная операция: получение значения элемента по ключу, записывается так же, как и для
списков: A[key]
. Если элемента с заданным ключом нет в словаре,
то возникает исключение
.
Другой способ определения значения по ключу — метод get
: A.get(key)
. Если элемента с ключом get
нет в словаре,
то возвращается значение None
. В форме записи с двумя аргументами A.get(key, val)
метод возвращает значение val
,
если элемент с ключом key
отсутствует в словаре.
Проверить принадлежность элемента словарю можно операциями in
и not in
, как и для множеств.
Для добавления нового элемента в словарь нужно просто присвоить ему какое-то значение:
.
Для удаления элемента из словаря можно использовать операцию del A[key]
(операция возбуждает исключение KeyError
, если такого ключа в словаре нет.
Вот два безопасных способа удаления элемента из словаря.
A = {'ab' : 'ba', 'aa' : 'aa', 'bb' : 'bb', 'ba' : 'ab'} key = 'ac' if key in A: del A[key] try: del A[key] except KeyError: print('There is no element with key "' + key + '" in dict') print(A)
В первом случае мы предварительно проверяем наличие элемента, а во втором — перехватываем и обрабатываем исключение.
Еще один способ удалить элемент из словаря: использование метода pop
: A.pop(key)
. Этот метод возвращает значение удаляемого элемента, если
элемент с данным ключом отсутствует в словаре, то возбуждается исключение. Если
методу pop
передать второй параметр, то если элемент в словаре отсутствует,
то метод pop
возвратит значение этого параметра. Это позволяет
проще всего организовать безопасное удаление элемента из словаря: A.pop(key, None)
.
Перебор элементов словаря
Можно легко организовать перебор ключей всех элементов в словаре:
A = dict(zip('abcdef', list(range(6)))) for key in A: print(key, A[key])
Следующие методы возвращают
keys
возвращает представление ключей всех элементов, метод values
возвращает представление всех значений, а метод items
возвращает представление всех пар (кортежей) из ключей и значений.Соответственно, быстро проверить, есть ли значение val
среди всех значений элементов словаря A
можно так: val in A.values()
, а организовать цикл так, чтобы
в переменной
был ключ элемента, а в переменной val
,
было его значение можно так:
A = dict(zip('abcdef', list(range(6)))) for key, val in A.items(): print(key, val)
Ссылки на задачи доступны в меню слева. Эталонные решения теперь доступны на странице самой задачи.
создание словаря Python, добавление элементов, удаление, поиск и другие операции, функции и методы
Словарь — это структура данных, которая позволяет записывать и получать различные значения по ключу. В некоторых языках ключами и значениями словаря могут быть только специфические объекты. А в Python — любые сущности: вплоть до пользовательских классов.
Как работать со словарями в Python
🚀 Создать
Ключевое слово dict
В Python есть множество встроенных функций. В том числе, чтобы получить стандартные структуры данных или преобразовать объекты к этим структурам. Если нужно создать пустой словарь, напишите:
my_new_dict = dict()
Синтаксическая конструкция
Еще, чтобы получить объект словаря, можно использовать синтаксис языка:
another_dict = {"string_key": "the value", 2: "another value"}
Выражение-генератор
Третий способ: применить выражение — генератор словаря. Это помогает составить словарь из пары итерируемых объектов, то есть объектов, которые можно повторять. Например:
list_one = ["one", "two", "three", "four", "five"] list_two = [1, 2, 3, 4, 5] the_dict = {} for k, v in zip(list_one, list_two): the_dict[k] = v + 1 print(the_dict["one"]) 2 print(the_dict["two"]) 3 print(the_dict.keys()) dict_keys(['one', 'two', 'three', 'four', 'five'])
Здесь каждое значение словаря было инкрементировано: то есть мы увеличили значение переменной. Но если вам не нужно преобразовывать значения, используйте более короткую конструкцию:
list_one = ["one", "two", "three", "four", "five"] list_two = [1, 2, 3, 4, 5] the_dict = dict(zip(list_one, list_two))
🚀 Получить значения
Для этого нужно обратиться к объекту словаря и указать нужный ключ:
the_dict = {0: "A", 1: "B", 2: "C", 3: "D", 4: "E"} let_a = the_dict[0] let_b = the_dict[1] print(f"{let_a}{let_b} -- {the_dict[2]}{the_dict[3]}") AB -- CD
🚀 Добавить, изменить и удалить элементы
Нужно обратиться по ключу к объекту словаря, выполнить операцию присваивания:
# добавление элементов the_dict = {} the_dict["my_key"] = "some value" the_dict["my_another_key"] = 42 # изменение элементов the_dict["my_key"] = "yet another value" # удаление элементов del the_dict["my_key"]
🚀 Проверить наличие ключа
Чтобы проверить, есть ли указанный ключ в словаре, используйте ключевое слово in или метод get словаря:
the_dict = {"a": 1, "b": 2} print("c" in the_dict) False print("a" in the_dict) True
Метод get объекта словаря возвращает найденное значение в словаре по ключу. Или значение, указанное как стандартное возвращаемое, — если ключ не найден:
the_dict = {"a": 1, "b": 2} if not the_dict.get("A", None): print("Такой ключ не найден") Такой ключ не найден a = the_dict.get("a", None) print(a) 1
🚀 Скопировать словарь
Чтобы получить неглубокую копию, вызовите метод copy или примените метод модуля copy: copy.copy. Если нужна глубокая, нужен метод copy.deepcopy.
import copy the_dict = {1: "a", 2:"b"} dict_copy = the_dict.copy() dict_copy2 = copy.copy(the_dict) # то же самое, что и в примере выше deep_copy = copy.deepcopy(the_dict) # полная, глубокая копия
🚀 Определить длину словаря
Узнайте, сколько ключей содержит словарь, с помощью встроенной функции len. Она возвращает количество итерируемых объектов.
the_dict = {"a": 1, "b": 2} length = len(the_dict) print(length) 2
Итерация словаря
https://sky.pro/media/obzor-biblioteki-pandas/Ключи, значения или всё вместе получают с помощью трех методов словаря. Для ключей — keys, для значений — values, для ключей и значений — items. Вызывать метод keys необязательно, так как при попытке итерации по словарю по умолчанию будут использоваться его ключи. По всем полученным данным можно произвести итерацию — повторить какое-либо действие.
✔️ По ключам
the_dict = {"a": 1, "b": 2} for k in the_dict.keys(): print(k) print(the_dict[k]) a 1 b 2
Keys используется по умолчанию, чтобы получить объект итератора:
the_dict = {"a": 1, "b": 2} for k in the_dict: # вызова keys не происходит print(k) print(the_dict[k]) a 1 b 2
✔️ По значениям
the_dict = {"a": 1, "b": 2} for v in the_dict. values(): print(v) 1 2
✔️ По ключам и значениям
Пример распаковки кортежа вида «ключ, значение», чтобы сохранить их в отдельные переменные:
the_dict = {"a": 1, "b": 2} for k, v in the_dict.items(): print(f"{k} - {v}") a - 1 b - 2
Другие методы
✔️ fromkeys
Этот метод позволяет создавать словари с ключами, полученными из итерируемого объекта. В качестве значения по умолчанию используется второй аргумент функции:
the_list = ["a", "b"] the_dict = dict.fromkeys(the_list, False) for v in the_dict.values(): print(v) False False for k in the_dict: print(k) a b
✔️ setdefault
Метод помогает указать стандартное значение ключа. При этом не изменять его, если оно уже есть по переданному ключу:
the_dict = {"a": 1, "b": 2} the_dict. setdefault("a", True) print(the_dict.keys()) dict_keys(['a', 'b']) print(the_dict.get("a", None)) 1
Вложенные словари
Словари могут содержать другие словари: в Python их называют вложенными. Они полезны при сериализации и десериализации. Их создают так:
the_dict = {"shape": "round", "size": 2} nested_dict = {"first_color": "blue", "second_color": "red"} the_dict["color"] = nested_dict print(the_dict) {'shape': 'round', 'size': 2, 'color': {'first_color': 'blue', 'second_color': 'red'}}
Альтернативные типы данных
В старых версиях Python ключи словаря не были упорядочены. Чтобы решить эту проблему, использовали модуль collections, а именно объект OrderedDict. Этот модуль тоже содержит и другие варианты словаря.
✔️ OrderedDict
Вместо типичной реализации по типу хеш-таблицы эта использует список кортежей, чтобы сохранять порядок ключей. В новых версиях языка в этом объекте уже нет смысла:
import collections the_dict = collections.OrderedDict({"a": 1, "b": 2, 3: "c"}) print(the_dict) OrderedDict([('a', 1), ('b', 2), (3, 'c')]) the_dict["d"] = "value" print(the_dict) OrderedDict([('a', 1), ('b', 2), (3, 'c'), ('d', 'value')])
✔️ Defaultdict
Объект класса defaultdict позволяет избежать ошибки KeyError при обращении к несуществующему ключу. Он возвращает стандартное значение, вычисляемое указанной функцией:
from collections import defaultdict def get_value(): return "Ключ не указан" the_dict = defaultdict(get_value) the_dict["a"] = 1 the_dict["b"] = 2 print(the_dict["a"]) 1 print(the_dict["b"]) 2 print(the_dict["c"]) Ключ не указан
✔️ Counter
Объект класса Counter полезен, когда нужно получить количество повторов объектов итерируемой сущности:
from collections import Counter the_string = "AABCBBCAACBCABBABABBACCACBCBBBCA" the_counter = Counter(the_string) print(the_counter) Counter({'B': 13, 'A': 10, 'C': 9})
Вебинары
Главное о работе со словарями в Python
- Словари представляют структуру данных типа «ключ-значение». Их создают с помощью ключевого слова dict, синтаксической конструкции и выражения-генератора.
- Метод copy позволяет скопировать словарь, метод get — проверить наличие ключа, функция len — определить длину словаря в Python.
- В качестве ключа и значения можно использовать любую структуру данных.
- Ключи, значения или всё вместе получают с помощью трех методов словаря: keys, values, items.
Изучайте Python на онлайн-курсе от Skypro «Python-разработчик». Программа под силу даже тем, у кого нет опыта в IT. Преподаватели — практикующие разработчики с опытом найма и наставничества.
После курса у вас будет достаточно опыта и знаний, чтобы претендовать на позиции младшего разработчика в компаниях или брать проекты на фрилансе. А еще мы поможем составить цепляющее резюме и подготовиться к вопросам рекрутеров на собеседованиях.
Словари Python
❮ Предыдущая Далее ❯
thisdict = {
«марка»: «Ford»,
«model»: «Mustang»,
«year»: 1964
}
Dictionary values
Словари используются для хранения данных в ключе: пары значений.
Словарь представляет собой упорядоченный*, изменяемый и не разрешить дубликаты.
Начиная с Python версии 3.7, словари упорядочены по . В Python 3.6 и более ранних словарях неупорядоченный .
Словари записываются в фигурных скобках и имеют ключи и значения:
Пример
Создание и печать словаря:
thisdict = {
«бренд»: «Ford»,
«model»: «Mustang»,
«year»: 1964
}
print(thisdict)
Попробуйте сами »
Элементы словаря
Элементы словаря упорядочены, изменяемы и не допускают дублирования.
Элементы словаря представлены парами ключ:значение, и на них можно ссылаться используя имя ключа.
Пример
Вывести значение «бренд» из словаря:
thisdict = {
«бренд»: «Ford»,
«модель»: «Mustang»,
«год»: 1964
}
print(thisdict [«бренд»])
Попробуйте сами »
Заказали или нет?
Начиная с Python версии 3. 7, словари упорядочены по . В Python 3.6 и более ранних версиях словари неупорядочены .
Когда мы говорим, что словари упорядочены, это означает, что элементы имеют определенный порядок, и этот порядок не изменится.
Неупорядоченный означает, что элементы не имеют определенный порядок, вы не можете ссылаться на элемент с помощью индекса.
Изменяемый
Словари изменяемы, что означает, что мы можем изменять, добавлять или удалять элементы после словарь создан.
Дубликаты не допускаются
В словарях не может быть двух элементов с одним и тем же ключом:
Пример
Повторяющиеся значения перезаписывают существующие значения:
thisdict = {
«brand»: «Ford»,
«model»: «Mustang»,
«year»: 1964,
«year»: 2020
}
print(thisdict)
Try it Yourself »
Длина словаря 90
Чтобы определить количество элементов в словаре, используйте len()
функция:
Пример
Вывести количество элементов в словаре:
print(len(thisdict))
Попробуйте сами »
Элементы словаря — типы данных
Значения в элементах словаря могут относиться к любому типу данных:
Пример
Типы данных String, int, boolean и list:
thisdict = {
«brand»: «Ford»,
«electric»: False,
«год»: 1964,
«цвета»: [«красный», «белый», «синий»]
}
Попробуйте сами »
type()
С точки зрения Python, словари определяются как объекты с типом данных ‘dict’:
Пример
Вывести тип данных словаря:
thisdict = {
«марка»: «Ford»,
«model»: «Mustang»,
«year»: 1964
}
print(type(thisdict))
Попробуйте сами »
Конструктор dict()
Также можно использовать конструктор dict() для создания словаря.
Пример
Использование метода dict() для создания словаря:
thisdict =
dict(имя = «Джон», возраст = 36, страна = «Норвегия»)
print(thisdict)
Попробуйте сами »
Коллекции (массивы) Python
В языке программирования Python существует четыре типа данных коллекций:
- Список — это упорядоченная и изменяемая коллекция. Позволяет дублировать участников.
- Кортеж представляет собой упорядоченный и неизменяемый набор. Позволяет дублировать участников.
- Набор представляет собой неупорядоченную коллекцию, неизменяемый* и неиндексируемый. Нет повторяющихся членов.
- Словарь – это коллекция, которая заказывается** и может быть изменена. Нет повторяющихся членов.
*Set элементы неизменны, но вы можете удалять и/или добавлять элементы всякий раз, когда вам нравится.
**Начиная с Python версии 3.7, словари упорядочены по . В Python 3.6 и более ранних версиях словари неупорядочены .
При выборе типа коллекции полезно понимать свойства этого типа. Выбор правильного типа для определенного набора данных может означать сохранение смысла, а также повышение эффективности или безопасности.
❮ Предыдущий Далее ❯
Словари на Python – Real Python
Смотреть Сейчас Это руководство содержит соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Словари в Python
Python предоставляет еще один составной тип данных, называемый словарем , который похож на список тем, что представляет собой набор объектов.
Вот чему вы научитесь в этом уроке: Вы познакомитесь с основными характеристиками словарей Python и узнаете, как получать доступ к данным словаря и управлять ими. После того, как вы закончите это руководство, вы должны иметь хорошее представление о том, когда словарь является подходящим типом данных для использования, и как это сделать.
Словари и списки имеют следующие общие характеристики:
- Оба они изменяемы.
- Оба являются динамическими. Они могут увеличиваться и уменьшаться по мере необходимости.
- Оба могут быть вложенными. Список может содержать другой список. Словарь может содержать другой словарь. Словарь также может содержать список и наоборот.
Словари отличаются от списков прежде всего способом доступа к элементам:
- Доступ к элементам списка осуществляется по их положению в списке посредством индексации.
- Доступ к элементам словаря осуществляется с помощью клавиш.
Примите участие в викторине: Проверьте свои знания с помощью нашей интерактивной викторины «Словари Python». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройдите тест »
Определение словаря
Словари— это реализация Python структуры данных, более известной как ассоциативный массив. Словарь состоит из набора пар ключ-значение. Каждая пара ключ-значение сопоставляет ключ со связанным с ним значением.
Вы можете определить словарь, заключив разделенный запятыми список пар ключ-значение в фигурные скобки ( {}
). Двоеточие ( :
) отделяет каждый ключ от связанного с ним значения:
д = { <ключ>: <значение>, <ключ>: <значение>, . . . <ключ>: <значение> }
Следующее определяет словарь, который сопоставляет местоположение с названием соответствующей бейсбольной команды Высшей лиги:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... }Расположение словаря в команде MLB
Вы также можете создать словарь с помощью встроенной функции dict()
. Аргумент к dict()
должен быть последовательностью пар ключ-значение. Для этого хорошо подходит список кортежей:
д = дикт ([ (<ключ>, <значение>), (<ключ>, <значение), . . . (<ключ>, <значение>) ])
MLB_team
также можно определить следующим образом:
>>>
>>> MLB_team = dict([ ... («Колорадо», «Скалистые горы»), ... ("Бостон", "Ред Сокс"), ... ("Миннесота", "Близнецы"), ... ("Милуоки", "Пивоварки"), ... («Сиэтл», «Моряки») ... ])
Если значения ключа представляют собой простые строки, их можно указать в качестве аргументов ключевого слова. Итак, вот еще один способ определить MLB_team
:
>>>
>>> MLB_team = dict( ... Колорадо='Скалистые горы', ... Бостон = "Ред Сокс", ... Миннесота = "Близнецы", ... Милуоки = "Пивоварки", ... Сиэтл='Моряки' ... )
После того, как вы определили словарь, вы можете отобразить его содержимое так же, как и для списка. Все три приведенных выше определения при отображении выглядят следующим образом:
>>>
>>> тип(MLB_team) <класс 'дикт'> >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки»}
Записи в словаре отображаются в том порядке, в котором они были определены. Но это не имеет значения, когда дело доходит до их извлечения. Элементы словаря не доступны по числовому индексу:
>>>
>>> MLB_team[1] Traceback (последний последний вызов): Файл "", строка 1, в MLB_команда[1] Ошибка ключа: 1
Возможно, вы все еще хотите отсортировать свой словарь. Если это так, ознакомьтесь с разделом Сортировка словаря Python: значения, ключи и многое другое.
Удалить рекламу
Доступ к значениям словаря
Разумеется, элементы словаря должны быть каким-то образом доступны. Если вы не получаете их по индексу, то как вы их получаете?
Значение извлекается из словаря путем указания соответствующего ключа в квадратных скобках ( []
):
>>>
>>> MLB_team['Миннесота'] 'Двойняшки' >>> MLB_team['Колорадо'] "Скалистые горы"
Если вы ссылаетесь на ключ, которого нет в словаре, Python вызывает исключение:
>>>
>>> MLB_team['Торонто'] Traceback (последний последний вызов): Файл "", строка 1, в MLB_team['Торонто'] KeyError: «Торонто»
Добавление записи в существующий словарь — это просто вопрос назначения нового ключа и значения:
>>>
>>> MLB_team['Канзас-Сити'] = 'Роялз' >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки», «Канзас-Сити»: «Ройалз»}
Если вы хотите обновить запись, вы можете просто присвоить новое значение существующему ключу:
>>>
>>> MLB_team['Сиэтл'] = 'Сихокс' >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Сихокс», «Канзас-Сити»: «Ройалз»}
Чтобы удалить запись, используйте оператор del
, указав ключ для удаления:
>>>
>>> del MLB_team['Сиэтл'] >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Канзас-Сити»: «Ройалз»}
Прочь, Сихокс! Ты команда НФЛ.
Ключи словаря и индексы списка
Возможно, вы заметили, что интерпретатор вызывает такое же исключение, KeyError
, когда доступ к словарю осуществляется с помощью неопределенного ключа или числового индекса:
>>>
>>> MLB_team['Торонто'] Traceback (последний последний вызов): Файл "", строка 1, в MLB_team['Торонто'] KeyError: «Торонто» >>> MLB_команда[1] Traceback (последний последний вызов): Файл " ", строка 1, в MLB_команда[1] Ошибка ключа: 1
По сути, это та же ошибка. В последнем случае [1]
выглядит как числовой индекс, но это не так.
Позже в этом руководстве вы увидите, что объект любого неизменяемого типа может использоваться в качестве ключа словаря. Соответственно, нет никаких причин, по которым вы не можете использовать целые числа:
.>>>
>>> d = {0: 'a', 1: 'b', 2: 'c', 3: 'd'} >>> д {0: "а", 1: "б", 2: "в", 3: "г"} >>> д[0] а >>> д[2] 'с'
В выражениях MLB_team[1]
, d[0]
и d[2]
, числа в квадратных скобках выглядят так, как будто они могут быть индексами. Но они не имеют ничего общего с порядком элементов в словаре. Python интерпретирует их как словарные ключи. Если вы определите этот же словарь в обратном порядке, вы все равно получите те же значения, используя те же ключи:
>>>
>>> d = {3: 'd', 2: 'c', 1: 'b', 0: 'a'} >>> д {3: "г", 2: "в", 1: "б", 0: "а"} >>> д[0] а >>> д[2] 'с'
Синтаксис может выглядеть похожим, но словарь нельзя рассматривать как список:
>>>
>>> тип(г) <класс 'дикт'> >>> д[-1] Traceback (последний последний вызов): Файл "", строка 1, в д[-1] Ключевая ошибка: -1 >>> д[0:2] Traceback (последний последний вызов): Файл " ", строка 1, в д[0:2] TypeError: unhashable type: 'slice' >>> d.append('e') Traceback (последний последний вызов): Файл " ", строка 1, в д. добавить ('е') AttributeError: объект 'dict' не имеет атрибута 'append'
Примечание: Хотя доступ к элементам в словаре не зависит от порядка, Python гарантирует сохранение порядка элементов в словаре. При отображении элементы будут отображаться в том порядке, в котором они были определены, и итерация по ключам также будет происходить в этом порядке. Элементы, добавленные в словарь, добавляются в конце. Если элементы удаляются, порядок оставшихся элементов сохраняется.
На такое сохранение порядка можно рассчитывать совсем недавно. Он был добавлен как часть спецификации языка Python в версии 3.7. Однако это было верно и для версии 3.6 — случайно в результате реализации, но не гарантируется спецификацией языка.
Удалить рекламу
Создание словаря постепенно
Определение словаря с помощью фигурных скобок и списка пар ключ-значение, как показано выше, вполне допустимо, если вы заранее знаете все ключи и значения. Но что, если вы хотите создать словарь на лету?
Вы можете начать с создания пустого словаря, который определяется пустыми фигурными скобками. Затем вы можете добавлять новые ключи и значения по одному:
>>>
>>> человек = {} >>> тип(человек) <класс 'дикт'> >>> person['fname'] = 'Джо' >>> person['lname'] = 'Fonebone' >>> человек['возраст'] = 51 >>> человек['супруга'] = 'Эдна' >>> человек['дети'] = ['Ральф', 'Бетти', 'Джоуи'] >>> person['pets'] = {'dog': 'Fido', 'cat': 'Sox'}
Когда словарь создан таким образом, доступ к его значениям осуществляется так же, как и к любому другому словарю:
>>>
>>> человек {'fname': 'Джо', 'lname': 'Fonebone', 'возраст': 51, 'супруга': 'Эдна', 'дети': ['Ральф', 'Бетти', 'Джоуи'], 'домашние животные': {'собака': 'Фидо', 'кошка': 'Сокс'}} >>> человек['fname'] 'Джо' >>> человек['возраст'] 51 >>> человек['дети'] ['Ральф', 'Бетти', 'Джоуи']
Для получения значений в подсписке или подсловаре требуется дополнительный индекс или ключ:
>>>
>>> человек['дети'][-1] 'Джоуи' >>> человек['домашние животные']['кошка'] «Сокс»
Этот пример демонстрирует еще одну особенность словарей: значения, содержащиеся в словаре, не обязательно должны быть одного типа. В person
некоторые значения являются строками, одно — целым числом, одно — списком, а третье — другим словарем.
Точно так же, как значения в словаре не обязательно должны быть одного типа, ключи не обязательно должны быть одного типа:
>>>
>>> foo = {42: 'aaa', 2.78: 'bbb', True: 'ccc'} >>> Фу {42: 'aaa', 2.78: 'bbb', True: 'ccc'} >>> фу[42] 'ааа' >>> фоо[2.78] 'ббб' >>> foo[Истина] 'ссс'
Здесь один из ключей — целое число, один — число с плавающей запятой и один — логическое значение. Не очевидно, как это будет полезно, но вы никогда не знаете.
Обратите внимание, насколько универсальны словари Python. В MLB_team
одна и та же информация (название бейсбольной команды) хранится для каждого из нескольких различных географических местоположений. person
, с другой стороны, хранит различные типы данных для одного человека.
Вы можете использовать словари для самых разных целей, потому что существует очень мало ограничений на разрешенные ключи и значения. Но есть некоторые. Читай дальше!
Ограничения на словарные ключи
Почти любой тип значения может использоваться в качестве ключа словаря в Python. Вы только что видели этот пример, где в качестве ключей используются целые, плавающие и логические объекты:
>>>
>>> foo = {42: 'aaa', 2.78: 'bbb', True: 'ccc'} >>> Фу {42: 'aaa', 2.78: 'bbb', True: 'ccc'}
Вы даже можете использовать встроенные объекты, такие как типы и функции:
>>>
>>> d = {int: 1, float: 2, bool: 3} >>> д {<класс 'int'>: 1, <класс 'float'>: 2, <класс 'bool'>: 3} >>> д[число] 2 >>> d = {бин: 1, шестнадцатеричный: 2, окт: 3} >>> д[октябрь] 3
Однако есть пара ограничений, которым должны соответствовать словарные ключи.
Во-первых, данный ключ может появиться в словаре только один раз. Дублирование ключей не допускается. Словарь сопоставляет каждому ключу соответствующее значение, поэтому нет смысла сопоставлять конкретный ключ более одного раза.
Вы видели выше, что когда вы присваиваете значение уже существующему ключу словаря, он не добавляет ключ во второй раз, а заменяет существующее значение:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... } >>> MLB_team['Миннесота'] = 'Тимбервулвз' >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Тимбервулвз', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки»}
Точно так же, если вы укажете ключ второй раз во время первоначального создания словаря, второе вхождение переопределит первое:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Тимбервулвз", ... «Милуоки»: «Пивоварки», ... «Сиэтл»: «Моряки», ... 'Миннесота': 'Близнецы' ... } >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки»}
Прочь, Тимбервулвз! Ты команда НБА. Вроде, как бы, что-то вроде.
Во-вторых, ключ словаря должен быть неизменяемого типа. Вы уже видели примеры, в которых несколько знакомых вам неизменяемых типов — целое число, число с плавающей запятой, строка и логическое значение — служили ключами словаря.
Кортеж также может быть ключом словаря, поскольку кортежи неизменяемы:
>>>
>>> d = {(1, 1): 'a', (1, 2): 'b', (2, 1): 'c', (2, 2): 'd '} >>> д[(1,1)] а >>> д[(2,1)] 'с'
(Вспомните из обсуждения кортежей, что одним из обоснований использования кортежа вместо списка является то, что существуют обстоятельства, когда требуется неизменяемый тип. Это один из них.)
Однако ни список, ни другой словарь не могут служить ключом словаря, поскольку списки и словари изменяемы:
>>>
>>> d = {[1, 1]: 'a', [1, 2]: 'b', [2, 1]: 'c', [2, 2]: 'd '} Traceback (последний последний вызов): Файл "", строка 1, в d = {[1, 1]: 'а', [1, 2]: 'б', [2, 1]: 'с', [2, 2]: 'г'} TypeError: unhashable type: 'list'
Техническое примечание: Почему в сообщении об ошибке указано «unhashable»?
Технически не совсем правильно говорить, что объект должен быть неизменяемым, чтобы его можно было использовать в качестве ключа словаря. Точнее, объект должен быть хэшируемым, то есть его можно передать хэш-функции. Хэш-функция берет данные произвольного размера и отображает их в относительно более простое значение фиксированного размера, называемое хеш-значением (или просто хеш), которое используется для поиска и сравнения в таблице.
Встроенная функция Python hash()
возвращает значение хеш-функции для объекта, который можно хешировать, и вызывает исключение для объекта, который не является хешируемым:
>>>
>>> hash('foo') 11132615637596761 >>> хэш([1, 2, 3]) Traceback (последний последний вызов): Файл "", строка 1, в TypeError: unhashable type: 'list'
Все встроенные неизменяемые типы, о которых вы уже узнали, являются хэшируемыми, а изменяемые контейнерные типы (списки и словари) — нет. Таким образом, для настоящих целей вы можете думать о хешируемом и неизменяемом как о более или менее синонимичных.
В будущих руководствах вы столкнетесь с изменяемыми объектами, которые также можно хэшировать.
Удалить рекламу
Ограничения на словарные значения
Напротив, нет никаких ограничений на значения словаря. Буквально никакой. Значением словаря может быть любой тип объекта, который поддерживает Python, включая изменяемые типы, такие как списки и словари, а также определяемые пользователем объекты, о которых вы узнаете в следующих руководствах.
Также нет ограничений на многократное появление определенного значения в словаре:
>>>
>>> d = {0: 'а', 1: 'а', 2: 'а', 3: 'а'} >>> д {0: "а", 1: "а", 2: "а", 3: "а"} >>> д[0] == д[1] == д[2] Истинный
Операторы и встроенные функции
Вы уже познакомились со многими операторами и встроенными функциями, которые можно использовать со строками, списками и кортежами. Некоторые из них также работают со словарями.
Например, операторы в
и не в
возвращают True
или False
в зависимости от того, встречается ли указанный операнд как ключ в словаре:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... } >>> "Милуоки" в MLB_team Истинный >>> «Торонто» в MLB_team ЛОЖЬ >>> "Торонто" не в MLB_team Истинный
Вы можете использовать в операторе
вместе с оценкой короткого замыкания, чтобы избежать возникновения ошибки при попытке доступа к ключу, которого нет в словаре:
>>>
>>> MLB_team['Торонто'] Traceback (последний последний вызов): Файл "", строка 1, в MLB_team['Торонто'] KeyError: «Торонто» >>> «Торонто» в MLB_team и MLB_team['Торонто'] ЛОЖЬ
Во втором случае из-за короткого замыкания выражение MLB_team['Toronto']
не оценивается, поэтому исключение KeyError
не возникает.
Функция len()
возвращает количество пар ключ-значение в словаре:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... } >>> Лен(MLB_team) 5
Методы встроенного словаря
Как и в случае строк и списков, существует несколько встроенных методов, которые можно вызывать для словарей. Фактически, в некоторых случаях методы списка и словаря имеют одно и то же имя. (При обсуждении объектно-ориентированного программирования вы увидите, что для разных типов вполне допустимо иметь методы с одинаковыми именами.)
Ниже приводится обзор методов, применимых к словарям:
д.очистить()
Очищает словарь.
d.clear()
очищает словарь d
всех пар ключ-значение:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> д. очистить() >>> д {}
Удалить рекламу
d.get([ ])
Возвращает значение ключа, если он существует в словаре.
Словарь Python .get()
обеспечивает удобный способ получения значения ключа из словаря без предварительной проверки существования ключа и без возникновения ошибки.
d.get(
ищет в словаре d
и возвращает соответствующее значение, если оно найдено. Если
не найден, возвращается None
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> напечатать (d.get ('b')) 20 >>> печать (d.get ('z')) Никто
Если <ключ>
не найден и указан необязательный аргумент <по умолчанию>
, возвращается это значение вместо Нет
:
>>>
>>> print(d. get('z', -1)) -1
д.элементы()
Возвращает список пар ключ-значение в словаре.
d.items()
возвращает список кортежей, содержащих пары ключ-значение в d
. Первый элемент в каждом кортеже — это ключ, а второй элемент — значение ключа:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> список(d.items()) [('а', 10), ('б', 20), ('в', 30)] >>> список(d.items())[1][0] 'б' >>> список(d.items())[1][1] 20
д.ключи()
Возвращает список ключей в словаре.
d.keys()
возвращает список всех ключей в d
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> список(d.keys()) ['а', 'б', 'в']
д.значения()
Возвращает список значений в словаре.
d.values()
возвращает список всех значений в d
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> список(d.values()) [10, 20, 30]
Любые повторяющиеся значения в d
будут возвращены столько раз, сколько они встречаются:
>>>
>>> д = {'а': 10, 'б': 10, 'с': 10} >>> д {'а': 10, 'б': 10, 'в': 10} >>> список(d.values()) [10, 10, 10]
Техническое примечание: Методы .items()
, .keys()
и .values()
на самом деле возвращают нечто, называемое объектом представления . Объект просмотра словаря более или менее похож на окно с ключами и значениями. Для практических целей вы можете думать об этих методах как о возвращаемых списках ключей и значений словаря.
Удалить рекламу
d. pop([ ])
Удаляет ключ из словаря, если он присутствует, и возвращает его значение.
Если
присутствует в d
, d.pop(
удаляет
и возвращает связанное с ним значение:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д.поп('б') 20 >>> д {'а': 10, 'в': 30}
d.pop(
вызывает исключение KeyError
, если
не находится в d
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д.поп('з') Traceback (последний последний вызов): Файл "", строка 1, в д.поп('г') KeyError: 'з'
Если <ключ>
не находится в d
и указан необязательный аргумент <по умолчанию>
, то возвращается это значение, и исключение не возникает:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> d. pop('z', -1) -1 >>> д {'а': 10, 'б': 20, 'в': 30}
д.попитем()
Удаляет пару ключ-значение из словаря.
d.popitem()
удаляет последнюю добавленную пару ключ-значение из d
и возвращает ее как кортеж:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д.попитем() ('с', 30) >>> д {'а': 10, 'б': 20} >>> д.попитем() ('б', 20) >>> д {'а': 10}
Если d
пусто, d.popitem()
вызывает исключение KeyError
:
>>>
>>> д = {} >>> д.попитем() Traceback (последний последний вызов): Файл "", строка 1, в д.попитем() KeyError: 'popitem(): словарь пуст'
Примечание: В версиях Python ниже 3.6 функция popitem()
вернет произвольную (случайную) пару ключ-значение, поскольку до версии 3.6 словари Python были неупорядочены.
д.обновление(<объект>)
Объединяет словарь с другим словарем или с итерацией пар ключ-значение.
Если
является словарем, d.update(
объединяет записи из
в d
. Для каждого ключа в
:
- Если ключ отсутствует в
d
, пара ключ-значение изд
. - Если ключ уже присутствует в
d
, соответствующее значение вd
для этого ключа обновляется до значения из
Вот пример, показывающий объединение двух словарей:
>>>
>>> d1 = {'a': 10, 'b': 20, 'c': 30} >>> d2 = {'b': 200, 'd': 400} >>> d1.update(d2) >>> д1 {'a': 10, 'b': 200, 'c': 30, 'd': 400}
В этом примере клавиша 'b'
уже существует в d1
, поэтому его значение обновляется до 200
, значение для этого ключа из d2
. Однако в d1
нет ключа 'd'
, поэтому пара ключ-значение добавляется из d2
.
также может быть последовательностью пар ключ-значение, подобно тому, как функция
dict() используется для определения словаря. Например,
можно указать как список кортежей:
>>>
>>> d1 = {'a': 10, 'b': 20, 'c': 30} >>> d1.update([('b', 200), ('d', 400)]) >>> д1 {'a': 10, 'b': 200, 'c': 30, 'd': 400}
Или значения для объединения можно указать в виде списка аргументов ключевого слова:
>>>
>>> d1 = {'a': 10, 'b': 20, 'c': 30} >>> d1.update(b=200, d=400) >>> д1 {'a': 10, 'b': 200, 'c': 30, 'd': 400}
Удалить рекламу
Вывод
В этом руководстве вы рассмотрели основные свойства словаря Python и узнали, как получить доступ к данным словаря и управлять ими.
Списки и словари — два наиболее часто используемых типа Python. Как вы видели, они имеют много общего, но различаются тем, как осуществляется доступ к их элементам. Доступ к элементам списков осуществляется по числовому индексу в зависимости от порядка, а доступ к элементам словаря осуществляется по ключу
.Из-за этой разницы списки и словари, как правило, подходят для разных обстоятельств. Теперь у вас должно быть хорошее представление о том, что лучше всего подходит для данной ситуации.
Далее вы узнаете о наборах Python . Набор — еще один составной тип данных, но он сильно отличается ни от списка, ни от словаря.
Примите участие в викторине: Проверьте свои знания с помощью нашей интерактивной викторины «Словари Python». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройдите тест »
Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python.