В языке Python структура данных под названием словарь (тип dict) занимает одну из ключевых позиций наряду с кортежами и списками. Словарь отличается гибкостью как у списка и неупорядоченностью в отличие от строк, списков и кортежей. Он содержит наборы пар "ключ:значение".
Термин "неупорядоченный" означает, что последовательность пар не имеет значения. Программа не учитывает положение элементов, поэтому доступ через индексы невозможен.
В других языках программирования такие структуры данных называются по-разному. В Java, к примеру, это отображения.
Для более наглядного понимания представьте словарь переводов языка — например, англо-русский. Каждое английское слово в нем имеет соответствующий русский перевод: cat – кошка, dog – собака, table – стол и т.д. В Python такой словарь можно выразить, указав английские слова в роли ключей, а русские — в роли значений:
{'cat': 'кошка', 'dog': 'собака', 'bird': 'птица', 'mouse': 'мышь'}
Отметьте использование фигурных скобок для обозначения словаря. Синтаксис Python для словарей таков:
Часто при выводе порядок пар "ключ:значение" может не совпадать с первоначальным вводом:
>>> a = { 'cat': 'кошка', 'dog': 'собака', 'bird': 'птица', 'mouse': 'мышь'} >>> a {'dog': 'собака', 'cat': 'кошка', 'bird': 'птица', 'mouse': 'мышь'}
Поскольку порядок пар не имеет значения в словаре, интерпретатор выводит их произвольно. Так как же обращаться к значению, раз индексы недоступны? Обращение к значениям осуществляется через ключи с использованием квадратных скобок, как это принято для индексов в списках:
>>> a['cat'] 'кошка' >>> a['bird'] 'птица'
Словари, подобно спискам, можно изменять: можно добавлять, редактировать и удалять элементы (пары "ключ:значение"). Словарь можно начать с пустого состояния (например, d = {}), а затем добавлять пары. Добавление и изменение выполняются одинаково: словарь[ключ] = значение. Если ключ присутствует, значение обновляется, если отсутствует — добавляется новая пара. Удаление осуществляется оператором del:
>>> a['elephant'] = 'бегемот' # добавляем >>> a['table'] = 'стол' # добавляем >>> a {'dog': 'собака', 'cat': 'кошка', 'mouse': 'мышь', 'bird': 'птица', 'table': 'стол', 'elephant': 'бегемот'} >>> a['elephant'] = 'слон' # изменяем >>> del a['table'] # удаляем >>> a {'dog': 'собака', 'cat': 'кошка', 'mouse': 'мышь', 'bird': 'птица', 'elephant': 'слон'}
Важно осознавать, что в словаре каждый ключ должен быть уникальным, при этом значения могут дублироваться.
Ключами могут выступать любые неизменяемые типы данных, тогда как значения могут быть представлены любыми типами, включая сложные структуры, такие как другие словари или списки.
>>> nums = {1: 'one', 2: 'two', 3: 'three'} >>> person = {'name': 'Tom', 1: [30, 15, 16], 2: 2.34, ('ab', 100): 'no'}
Перебор элементов словаря с помощью цикла for
Как и для других сложных объектов в Python, элементы словаря можно перебрать с помощью цикла for, при этом по умолчанию извлекаются только ключи:
>>> nums {1: 'one', 2: 'two', 3: 'three'} >>> for i in nums: ... print(i) ... 1 2 3
Ключи дают возможность получения значений:
>>> for i in nums: ... print(nums[i]) ... one two three
Класс словарей включает метод items(), создающий специальную структуру, состоящую из кортежей, где каждый кортеж — это пара "ключ + значение":
>>> n = nums.items() >>> n dict_items([(1, 'one'), (2, 'two'), (3, 'three')])
Можно распаковывать кортежи прямо в цикле for, извлекая одновременно ключ и его значение:
>>> for key, value in nums.items(): ... print(key, 'is', value) ... 1 is one 2 is two 3 is three
Методы keys() и values() позволяют получить отдельно список ключей и значений. Когда нужно работать исключительно с ключами или значениями, обращайтесь к этим методам:
>>> v_nums = [] >>> for v in nums.values(): ... v_nums.append(v) ... >>> v_nums ['one', 'two', 'three']
Методы словаря
Помимо items(), keys() и values(), у словарей имеется ещё восемь методов. Это такие методы как clear(), copy(), fromkeys(), get(), pop(), popitem(), setdefault() и update().
Функция clear() устраняет все элементы из словаря, сохраняя пустое пространство для дальнейшего использования:
>>> a {'dog': 'собака', 'cat': 'кошка', 'mouse': 'мышь', 'bird': 'птица', 'elephant': 'слон'} >>> a.clear() >>> a {}
Как изменяемый тип данных, словарь передается в функцию по ссылке, аналогично спискам. Чтобы избежать ненужных изменений глобального словаря или для других целей, его можно скопировать.
>>> nums2 = nums.copy() >>> nums2[4] = 'four' >>> nums {1: 'one', 2: 'two', 3: 'three'} >>> nums2 {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
Метод fromkeys() создает словарь из списка, где элементы становятся ключами. Эта функция применяется как к классу dict, так и к его объектам:
>>> a = [1, 2, 3] >>> c = dict.fromkeys(a) >>> c {1: None, 2: None, 3: None} >>> d = dict.fromkeys(a, 10) >>> d {1: 10, 2: 10, 3: 10} >>> c {1: None, 2: None, 3: None}
Метод get() возвращает элемент по ключу:
>>> nums.get(1)
'one'
Она эквивалентна nums[1].
Метод pop() удаляет элемент по ключу и возвращает его значение, а popitem() не требует аргументов и возвращает произвольную пару:
>>> nums.pop(1)
'one'
>>> nums
{2: 'two', 3: 'three'}
>>> nums.popitem()
(2, 'two')
>>> nums
{3: 'three'}
С помощью setdefault() можно добавить элемент в словарь:
>>> nums.setdefault(4, 'four') 'four' >>> nums {3: 'three', 4: 'four'}
Так же, как команда nums[4] = 'four'
, если ключ 4 отсутствует в словаре. Если
он есть, nums[4] = 'four'
изменит его значение, но setdefault() этого не сделает.
Метод update() позволяет включать элементы из другого словаря в текущий:
>>> nums.update({6: 'six', 7: 'seven'}) >>> nums {3: 'three', 4: 'four', 6: 'six', 7: 'seven'}
Метод обновляет значения уже существующих ключей и имеет множество дополнительных применений.
Практическая часть
- Создайте словарь, связанный с переменной school, и заполните его сведениями о количестве учащихся в различных классах (например, 1а, 1б, 2б, 6а, 7в). Измените словарь так: а) в одном из классов изменилось число учащихся, б) добавлен новый класс, в) один класс расформирован. Посчитайте общее количество учеников.
- Создайте словарь, где ключи представлены числами, а значения — строками. Используйте метод items() и передайте объект dict_items в функцию, которая создаст и возвратит новый словарь, в котором ключи станут значениями, а значения — ключами.