Словари в Python

В этом руководстве вы узнаете всё о словарях в Python: как их создавать, как добавлять, удалять, как получать из них элементы, а еще познакомитесь со встроенными методами словарей.

Словарь — это неупорядоченный набор элементов. Элемент словаря представляет собой пару ключ: значение. Словари оптимизированы для получения значений по заданному ключу.

Как создать словарь

Чтобы создать словарь в Python, необходимо прописать элементы внутри фигурных скобок {} и разделить их запятыми.

В элементе содержится ключ и соответствующее значение, они записываются так: (ключ: значение).

В словарях значения могут повторяться и быть любого типа. Ключи же повторяться не могут и должны быть неизменяемым типом (строками, числовыми типами и кортежами с неизменяемыми элементами).

# пустой словарь
my_dict = {}

# словарь с ключами — целочисленными значениями
my_dict = {1: 'яблоко', 2: 'мяч'}

# словарь с ключами разных типов
my_dict = {'имя': 'Джон', 1: [2, 4, 3]}

# используем dict()
my_dict = dict({1:'яблоко', 2:'мяч'})

# словарь из последовательности, где элементы являются парами
my_dict = dict([(1,'яблоко'), (2,'мяч')])

Как вы увидели выше, мы можем создать словарь с помощью встроенной функции dict().

Как получить элементы из словаря

В отличие от других типов данных, где для доступа к элементам используется индексация, в словаре используются ключи. Они используются внутри квадратных скобок или в качестве аргумента метода get().

При использовании квадратных скобок и отсутствии элемента в словаре вызывается ошибка KeyError. При использовании метода get() и отсутствии элемента возвращается None.

# get vs. [] для получения элементов
my_dict = {'Имя': 'Ваня', 'Возраст': 26}

# Вывод: Jack
print(my_dict['Имя'])

# Вывод: 26
print(my_dict.get('Возраст'))

# Попытка получить ключ, которого не существует, приводит к ошибке
# Вывод: None
print(my_dict.get('Адрес'))

# KeyError
print(my_dict['Адрес'])

Вывод:

Ваня
26
None
Traceback (most recent call last):
 File "<string>", line 15, in <module>
   print(my_dict['Адрес'])
KeyError: 'Адрес'

Как изменить или добавить элементы в словаре

Словари — изменяемый тип данных. Это значит, что в него можно добавить новые элементы или изменить уже существующие с помощью оператора присваивания.

Если добавляемый ключ есть в словаре, значение элемента изменяется. Если же такого ключа еще нет, то в словарь добавляется новая пара (ключ: значение).

# Изменение словаря
my_dict = {'Имя': 'Ваня', 'Возраст': 26}

# обновляем значение
my_dict['Возраст'] = 27

# Вывод: {'Возраст': 27, 'Имя': 'Ваня'}
print(my_dict)

# добавляем элемент
my_dict['Адрес'] = 'Центр города'

# Вывод: {'Адрес': 'Центр города', 'Возраст': 27, 'Имя': 'Ваня'}
print(my_dict)

Вывод:

{'Возраст': 27, 'Имя': 'Ваня'}
{'Адрес': 'Центр города', 'Возраст': 27, 'Имя': 'Ваня'}

Как удалить элементы из словаря

Удалить нужный элемент словаря по ключу можно с помощью метода pop(). Этот метод удаляет элемент с соответствующим ключом и возвращает значение.

Удалить произвольную пару (ключ, значение) можно с помощью метода popitem(). Очистить весь словарь за один раз можно с помощью метода clear().

Также можно использовать ключевое слово del для удаления отдельных элементов или же всего словаря.

# создаем словарь
squares = {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# удаляет определенный элемент, возвращает его значение
# Вывод: 16
print(squares.pop(4))

# Вывод: {1: 1, 2: 4, 3: 9, 5: 25}
print(squares)

# удаляет произвольный элемент, возвращает (ключ, эзначение)
# Вывод: (5, 25)
print(squares.popitem())

# Вывод: {1: 1, 2: 4, 3: 9}
print(squares)

# удаляет все элементы
squares.clear()

# Вывод: {}
print(squares)

# удаляет весь словарь
del squares

# выдает ошибку
print(squares)

Вывод:

16
{1: 1, 2: 4, 3: 9, 5: 25}
(5, 25)
{1: 1, 2: 4, 3: 9}
{}
Traceback (most recent call last):
 File "<string>", line 30, in <module>
   print(squares)
NameError: name 'squares' is not defined

Методы словарей

В таблице ниже указаны доступные методы словарей. Некоторые из них мы уже использовали в примерах выше.

Метод

Что делает

clear()

Удаляет все элементы из словаря

copy()

Возвращает неглубокую копию словаря

fromkeys(seq[, v])

Возвращает словарь с ключами из seq и значениями, равными v (по умолчанию None)

get(key[,d])

Возвращает значение ключа key. Если key не существует, возвращает d (по умолчанию None)

items()

Возвращает новый объект элементов словаря в формате (ключ, значение)

keys()

Возвращает новый объект с ключами словаря

pop(key[,d])

Удаляет элемент с ключом key и возвращает его значение или d, если key не найден. Если d не было обозначено и key не найден, вызывает ошибку KeyError. 

popitem()

Удаляет и возвращает произвольную пару (ключ, значение). Вызывае ошибку KeyError, если словарь пустой.

setdefault(key[,d])

Если ключ key есть в словаре, возвращает соответствующее ему значение. Если нет, добавляет в словарь элемент с ключом key и значением d и возвращает d (по умолчанию None

update([other])

Обновляет словарь имеющимися парами ключ/значение из other, перезаписывая существующие ключи

values()

Возвращает новый объект со значениями словаря

 

marks = {}.fromkeys(['математика', 'русский язык', 'физика'], 0)

# Вывод: {'русский язык': 0, 'математика': 0, 'физика': 0}
print(marks)

for item in marks.items():
    print(item)

# Вывод: ['русский язык', 'математика', 'физика']
print(list(sorted(marks.keys())))

Вывод:

{'математика': 0, 'русский язык': 0, 'физика': 0}
('математика', 0)
('русский язык', 0)
('физика', 0)
['русский язык', 'математика', 'физика']

Представление словарей

Представление словарей — элегантный и лаконичный способ создать новый словарь из итерируемого объекта.

Представление словарей состоит из выражения ключ: значение, за которым следует for, и всё это — внутри фигурных скобок {}.

Создадим словарь с парами чисел и их квадратов в качестве элементов:

squares = {x: x*x for x in range(6)}
print(squares)

Вывод:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

То же самое можно сделать иначе, но так будет длинее:

squares = {}
for x in range(6):
    squares[x] = x*x
print(squares)

Вывод:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

В представлении словарей выражений for и if опционально может быть больше.

Необязательное выражение if поможет отфильтровать элементы для создания нового словаря.

Давайте создадим словарь только с квадратами только нечетных чисел:

# Представление словарей с опциональным if
odd_squares = {x: x*x for x in range(11) if x % 2 == 1}
print(odd_squares)

Вывод:

{1: 1, 3: 9, 5: 25, 7: 49, 9: 81}

Другие операции со словарями

Проверка на вхождение в словарь

Проверить, есть ли ключ в словаре, можно с помощью ключевого слова in. Отметим, что проверку на вхождение можно провести только над ключами, не над значениями

squares = {1: 1, 3: 9, 5: 25, 7: 49, 9: 81}

# Вывод: True
print(1 in squares)

# Вывод: True
print(2 not in squares)

# Проверка на вхождение позволяет проверять только ключи, не значения
# Вывод: False
print(49 in squares)

Вывод:

True
True
False

Итерирование по словарю

Мы можем пройтись по всем ключам словаря, используя цикл for.

squares = {1: 1, 3: 9, 5: 25, 7: 49, 9: 81}
for i in squares:
    print(squares[i])

Вывод:

1
9
25
49
81

Встроенные функции для словарей

Встроенные функции all(), any(), len(), cmp(), sorted() и т. д. часто используются со словарями для разных задач.

Функция

Описание

all()

Возвращает True, если все ключи словаря = True (или если словарь пуст)

any()

Возвращает True, если хотя бы один ключ словаря = True. Если словарь пуст, возвращает False.

len()

Возвращает длину (количество элементов) словаря

cmp()

Сравнивает элементы двух словарей (не работает в Python 3)

sorted()

Возвращает новый список с отсортированными ключами словаря

# Встроенные функции для словарей
squares = {0: 0, 1: 1, 3: 9, 5: 25, 7: 49, 9: 81}

# Вывод: False
print(all(squares))

# Вывод: True
print(any(squares))

# Вывод: 6
print(len(squares))

# Вывод: [0, 1, 3, 5, 7, 9]
print(sorted(squares))

Вывод:

False
True
6
[0, 1, 3, 5, 7, 9]

 

codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©