Словари в Python
Словари (dict) в Python — это неупорядоченная коллекция, которая хранит данные в парах ключ-значение. Создавая словарь, мы передаем последовательность элементов внутрь фигурных скобок {}, разделяя их запятыми (,). Каждый элемент имеет ключ и значение, выраженное парой «ключ: значение».
Наглядно синтаксис словарей выглядит следующим образом:
items_dict = {"vehicle": "Tesla", "fruit": "apple", "lucky_number": 7}Вот ещё один пример словаря, где ключами являются числа, а значениями — строки:
gender_dict = {0: 'woman',
1: 'man'}Как видно из примеров, для создания словаря можно перечислить в фигурных скобках пары: ключ и значение. Ключ и значение отделяются двоеточием и пробелами, а пары перечисляются через запятую.
Другой способ создать словарь - это использовать функцию dict().
empty_dict = dict()
Функция dict() создаст словарь, инициализированный из необязательного позиционного аргумента и возможно пустого набора ключевых аргументов.
Параметры:
kwarg- ключевые аргументыone=1, two=2, three=3iterable- итерируемый объект, например список следующего вида[('one', 1), ('two', 2), ('three', 3)]mapping- словарь, например{'three': 3, 'two': 2, 'one': 1}
Если позиционный аргумент не задан, создается пустой словарь, как в примере выше.
Примеры использования функции dict:
# создание словаря с помощью ключевых аргументов
dict_sample = dict(one=1, two=2, three=3)
print(dict_sample) # {'one': 1, 'two': 2, 'three': 3}
# создание словаря с помощью другого словаря
dict_sample = dict({0: 'orange', 1: 'pawpaw'})
print(dict_sample) # {0: 'orange', 1: 'pawpaw'}
# создание словаря с помощью последовательности
dict_sample = dict([(0,'apple'), (1,'pawpaw')])
print(dict_sample) # {0: 'apple', 1: 'pawpaw'}
Личная рекомендация: Для большинства случаев следует использовать фигурные скобки{}для создания пустого словаря из-за их более высокой производительности и лучшей читаемости кода. Использование функцииdict()может быть оправдано в специфических случаях, например, при создании словаря с определёнными параметрами или в контексте более сложных выражений.
Важно отметить некоторые особенности словарей:
- Ключом в словаре может быть только неизменяемый тип данных (например, строка, число или кортеж).
- Значением может быть любой тип данных, включая другие словари или списки.
В первом пункте, есть небольшая неточность. Дело в том, что ключи в словарях должны быть хешируемыми. Это означает, что они должны иметь неизменяемое хэш-значение, что гарантирует их уникальность и неизменность в контексте словаря. Однако подобные тонкости будут рассмотрены более подробно в другой статье.
В отличие от списков, где для получения элементов необходимо обращаться к ним по числовому индексу, в словарях мы обращаемся к элементам по ключу. Это дает больше гибкости и удобства при работе с данными.
Для получения значения в словаре, необходимо указать ключ в квадратных скобках после имени словаря:
items_dict = {"vehicle": "Tesla", "fruit": "apple", "lucky_number": 7}
print(items_dict["vehicle"])Tesla
При попытке получить значение по несуществующему ключу вызывается исключение KeyError
items_dict = {"vehicle": "Tesla", "fruit": "apple", "lucky_number": 7}
print(items_dict["test"])В качестве результата получим следующее сообщение:
print(items_dict["test"])
~~~~~~~~~~^^^^^^
KeyError: 'test'Как получить элементы списка без ошибок?
Первый способ избежать подобной ошибки. Это использовать уже известный нам оператора in.
При помощи него мы можем проверить, существует ли ключ в словаре:
items_dict = {"vehicle": "Tesla", "fruit": "apple", "lucky_number": 7}
print("vehicle" in items_dict)
print("qwerty" in items_dict)
print("123" in items_dict)True False False
Второй способ. Использование специального метода get(key[, default])
Этот метод возвращает значение для ключа, если ключ находится в словаре, иначе возвращает значение по умолчанию default. Если значение по умолчанию не задано, метод возвращает None (но никогда не возвращает исключение).
Добавление и изменение содержимого словаря
Добавление новых пар в словарь происходит достаточно просто:
temp_dict = {}
temp_dict["key"] = "value"
print(temp_dict){"key": "value"}Изменение выполняется абсолютно также:
temp_dict = {"key": "value"}
temp_dict["key"] = "new_value"
print(temp_dict["key"])new_value
Обратите внимание, при записи значения по уже существующему ключу он создаётся заново с новым значением, а прошлый стирается
Для добавления/изменения сразу нескольких объектов в словаре, используется специальный метод update([other]). Он обновляет словарь парами ключ-значение из other, перезаписывая существующие ключи.
В дальнейших примерах мы будем использовать следующий словарь, содержащий в себе информацию о студентах:
students = {
'Alice': {'age': 22, 'major': 'Computer Science'},
'Bob': {'age': 21, 'major': 'Mathematics'}
}Пример 1: Добавление нового студента
new_student = {'Charlie': {'age': 23, 'major': 'Physics'}}
students.update(new_student)
print(students){'Alice': {'age': 22, 'major': 'Computer Science'}, 'Bob': {'age': 21, 'major': 'Mathematics'}, 'Charlie': {'age': 23, 'major': 'Physics'}}Пример 2: Обновление информации о существующем студенте
update_info = {'Bob': {'age': 22, 'major': 'Data Science'}}
students.update(update_info)
print(students){'Alice': {'age': 22, 'major': 'Computer Science'}, 'Bob': {'age': 22, 'major': 'Data Science'}, 'Charlie': {'age': 23, 'major': 'Physics'}}Пример 3: Добавление нового студента и обновление информации о другом с помощью ключевых аргументов
students.update({'David': {'age': 24, 'major': 'Biology'}}, Alice={'age': 23, 'major': 'Artificial Intelligence'})
print(students){'Alice': {'age': 23, 'major': 'Artificial Intelligence'}, 'Bob': {'age': 22, 'major': 'Data Science'}, 'Charlie': {'age': 23, 'major': 'Physics'}, 'David': {'age': 24, 'major': 'Biology'}}Пример 4: Обновление словаря с помощью итерируемого объекта
students.update([('Eve', {'age': 25, 'major': 'Chemistry'}), ('Charlie', {'age': 24, 'major': 'Quantum Physics'})])
print(students){'Alice': {'age': 23, 'major': 'Artificial Intelligence'}, 'Bob': {'age': 22, 'major': 'Data Science'}, 'Charlie': {'age': 24, 'major': 'Quantum Physics'}, 'David': {'age': 24, 'major': 'Biology'}, 'Eve': {'age': 25, 'major': 'Chemistry'}}Пример 5: Обновление словаря с помощью другого словаря, содержащего вложенные словари
new_data = {
'Alice': {'age': 24, 'major': 'Machine Learning'},
'Frank': {'age': 26, 'major': 'Economics'}
}
students.update(new_data)
print(students){'Alice': {'age': 24, 'major': 'Machine Learning'}, 'Bob': {'age': 22, 'major': 'Data Science'}, 'Charlie': {'age': 24, 'major': 'Quantum Physics'}, 'David': {'age': 24, 'major': 'Biology'}, 'Eve': {'age': 25, 'major': 'Chemistry'}, 'Frank': {'age': 26, 'major': 'Economics'}}Удаление элементов из словаря
Для удаления элемента из словаря можно использовать либо оператор del dict[key], либо метод dict.pop(key[, default]). В первом случае из словаря удаляется соответствующая пара. Или, если такого ключа нет, возвращается KeyError.
Пример 1: Использование del для удаления элемента
temp_dict = {"key": "value"}
# Удаляем элемент с ключом "key"
del temp_dict["key"]
print(f"temp_dict = {temp_dict}")
# Удаляем элемент с несуществующим ключом
del temp_dict["python"]temp_dict = {}
Traceback (most recent call last):
File "", line 1, in
KeyError: 'python'Метод dict.pop(key[, default]) удаляет из словаря элемент с заданным ключом и возвращает его значение. Если ключ отсутствует, метод возвращает значение default . Если значение default не задано и ключа не существует, метод pop() вызовет исключение KeyError.
Пример 2: Использование dict.pop(key[, default]) для удаления элемента
temp_dict = {"key": "value"}
deleted_value = temp_dict.pop("key")
print(f"Удаленное значение: {deleted_value}")
print(f"temp_dict = {temp_dict}\n")
deleted_value = temp_dict.pop("non_existent_key", "default_value")
print(f"Возвращенное значение: {deleted_value}")
print(f"temp_dict = {temp_dict}")Удаленное значение: value
temp_dict = {}
Возвращенное значение: default_value
temp_dict = {'key': 'value'}Пример 3: Использование dict.pop(key[, default]) с отсутствующим ключом без значения по умолчанию
temp_dict = {"key": "value"}
value = temp_dict.pop("non_existent_key")
print(f"temp_dict = {temp_dict}")Traceback (most recent call last):
File "", line 4, in <module>
value = temp_dict.pop("non_existent_key")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyError: 'non_existent_key'Методы словарей
Словари в Python имеют множество различных полезных методов, которые помогут вам в работе с ними. C некоторыми из них вы уже успели познакомиться. Всё повторим и разберемся с неизученными :).
1. copy()
dict.copy()
Описание:
Этот метод возвращает поверхностную копию словаря. Мы должны быть осторожны с такими копиями: если словарь содержит списки, кортежи или множества, то в созданной копии будут только ссылки на объекты из оригинала.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
dict2 = dict1.copy()
print(dict2) # Выведет {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}При использовании метода copy() для создания копии словаря, если словарь содержит списки, кортежи, множества или другие словари, то в созданной копии будут только ссылки на объекты из оригинала. Это означает, что изменения во вложенных объектах в копии будут отражаться и в оригинале.
import copy
# Исходный словарь с вложенными списками
original_dict = {
'a': [1, 2, 3],
'b': (4, 5, 6),
'c': {7, 8, 9}
}
# Создаем поверхностную копию
shallow_copy = original_dict.copy()
# Изменяем вложенный список в поверхностной копии
shallow_copy['a'].append(4)
# Выводим оригинальный словарь и поверхностную копию
print("Оригинальный словарь:", original_dict)
print("Поверхностная копия:", shallow_copy)Оригинальный словарь: {'a': [1, 2, 3, 4], 'b': (4, 5, 6), 'c': {8, 9, 7}}
Поверхностная копия: {'a': [1, 2, 3, 4], 'b': (4, 5, 6), 'c': {8, 9, 7}}Как видно из результата, изменения во вложенном списке в поверхностной копии отразились и в оригинале.
Чтобы избежать этой проблемы, можно создать глубокую копию словаря, используя функцию copy.deepcopy(x). Глубокая копия создает независимую копию всех вложенных объектов.
import copy
# Исходный словарь с вложенными списками
original_dict = {
'a': [1, 2, 3],
'b': (4, 5, 6),
'c': {7, 8, 9}
}
# Создаем глубокую копию
deep_copy = copy.deepcopy(original_dict)
# Изменяем вложенный список в глубокой копии
deep_copy['a'].append(4)
# Выводим оригинальный словарь и глубокую копию
print("Оригинальный словарь:", original_dict)
print("Глубокая копия:", deep_copy)Оригинальный словарь: {'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {8, 9, 7}}
Глубокая копия: {'a': [1, 2, 3, 4], 'b': (4, 5, 6), 'c': {8, 9, 7}}Теперь изменения во вложенном списке в глубокой копии не отражаются в оригинале, так как глубокая копия создает независимую копию всех вложенных объектов.
Пояснения:
- Поверхностная копия: Создает копию словаря, но вложенные объекты (списки, кортежи, множества) остаются ссылками на оригинальные объекты.
- Глубокая копия: Создает полностью независимую копию словаря, включая все вложенные объекты.
Использование глубокой копии позволяет избежать нежелательных побочных эффектов при работе с вложенными структурами данных.
2. get(key[, default])
dict.get(key[, default])
Описание:
Возвращает значение по указанному ключу. Если ключ отсутствует, возвращает значение default (по умолчанию None).
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
print(dict1.get('car')) # Выведет 'машина'
print(dict1.get('home', 'дом')) # Выведет 'дом', так как ключ 'home' отсутствует3. clear()
dict.clear()
Описание:
Удаляет все элементы из словаря.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
dict1.clear()
print(dict1) # Выведет {}4. keys()
dict.keys()
Описание:
Возвращает объект представления, содержащий все ключи словаря.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
print(dict1.keys()) # Выведет dict_keys(['car', 'apple', 'orange'])5. values()
dict.values()
Описание:
Возвращает объект представления, содержащий все значения словаря.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
print(dict1.values()) # Выведет dict_values(['машина', 'яблоко', 'апельсин'])6. items()
dict.items()
Описание:
Возвращает объект представления, содержащий пары ключ-значение в виде кортежей.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
print(dict1.items()) # Выведет dict_items([('car', 'машина'), ('apple', 'яблоко'), ('orange', 'апельсин')])7. pop(key[, default])
dict.pop(key[, default])
Описание:
Удаляет элемент с указанным ключом и возвращает его значение. Если ключ отсутствует, возвращает значение default (если оно указано) или вызывает исключение KeyError.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
print(dict1.pop('car')) # Выведет 'машина'
print(dict1.pop('home', 'дом')) # Выведет 'дом', так как ключ 'home' отсутствует
print(dict1) # Выведет {'apple': 'яблоко', 'orange': 'апельсин'}8. popitem()
dict.popitem()
Описание:
Удаляет и возвращает последнюю добавленную пару ключ-значение в виде кортежа. Если словарь пуст, метод вызывает исключение KeyError.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
print(dict1.popitem()) # Выведет ('orange', 'апельсин')
print(dict1) # Выведет {'car': 'машина', 'apple': 'яблоко'}9. setdefault(key[, default])
dict.setdefault(key[, default])
Описание:
Возвращает значение по указанному ключу. Если ключ отсутствует, метод добавляет его в словарь со значением default (по умолчанию None).
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
print(dict1.setdefault('car')) # Выведет 'машина'
print(dict1.setdefault('home', 'дом')) # Выведет 'дом'
print(dict1) # Выведет {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин', 'home': 'дом'}10. update([other])
dict.update([other])
Описание:
Обновляет словарь, добавляя пары ключ-значение из другого словаря или итерируемого объекта. Существующие ключи перезаписываются новыми значениями.
dict1 = {'car': 'машина', 'apple': 'яблоко', 'orange': 'апельсин'}
dict1.update({'car': 'автомобиль', 'home': 'дом'})
print(dict1) # Выведет {'car': 'автомобиль', 'apple': 'яблоко', 'orange': 'апельсин', 'home': 'дом'}На этом данная статья заканчивается, благодарю вас за внимание! Если у вас остались вопросы, смело задавайте их в нашем телеграмм канале!