Python словарь: подробный обзор типа данных и его возможностей
Словарь (dict) в Python: основной тип данных для хранения пар ключ-значение
Базовый способ работы со словарем
Словарь в Python представляет неупорядоченную (начиная с Python 3.7 порядок вставки сохраняется) коллекцию пар ключ-значение. Ключи должны быть неизменяемыми (строки, числа, кортежи). Создается с помощью фигурных скобок:
user = {'name': 'Alice', 'age': 30}Set str python (множество из строки в python)
Доступ к значению выполняется через квадратные скобки, но при отсутствии ключа возникает исключение KeyError. Безопаснее использовать метод get:
name = user.get('name') # 'Alice'
phone = user.get('phone', 'не указан') # 'не указан'Python переменная время (переменные для времени в python)
Добавление новой пары или изменение существующей - через присваивание:
user['email'] = 'alice@example.com' # добавление
user['age'] = 31 # изменение
Python типы данных время (типы данных для времени в python)
Удаление элементов:
del user['age'] # удаляет ключ 'age'
role = user.pop('role', 'guest') # удаляет 'role' или возвращает 'guest'
user.popitem() # удаляет последнюю вставленную пару (Python 3.7+)Python объект тип (тип объекта в python)
Итерация по словарю:
for key, value in user.items():
print(key, value)вещественные значения python (вещественные значения в python)
Частая ошибка - обращение по несуществующему ключу через квадратные скобки. Рекомендуется предварительная проверка if 'key' in dict: или использование метода get с умолчанием.
Как создать словарь разными способами?
Помимо литерала с фигурными скобками, доступны следующие варианты:
dict(name='Alice', age=30)- ключи задаются как именованные аргументы (только строки)dict([('a',1), ('b',2)])- из списка кортежейdict.fromkeys(['a','b','c'], 0)- создает словарь с указанными ключами и общим значением{x: x**2 for x in range(5)}- генератор словаря
# Создание из двух списков с помощью zip
keys = ['name', 'age']
values = ['Bob', 25]
person = dict(zip(keys, values))
print(person) # {'name': 'Bob', 'age': 25}вывести тип данных python (вывод типа данных в python)
При использовании dict() с именованными аргументами ключи обязаны быть строками, иначе возникает ошибка. Порядок ключей в литералах сохраняется (Python 3.7+), но при создании через zip порядок определяется исходными списками.
Как получить значение по ключу без ошибки, если ключ отсутствует?
Метод get возвращает значение по ключу или заданное значение по умолчанию (по умолчанию None). Метод setdefault дополнительно записывает значение по умолчанию в словарь, если ключ отсутствует.
inventory = {'apple': 5, 'banana': 3}
count = inventory.get('orange', 0) # 0
inventory.setdefault('orange', 0) # добавляет ключ 'orange' со значением 0, возвращает 0Python двоичные данные (работа с двоичными данными в python)
Обращение через квадратные скобки к отсутствующему ключу вызывает KeyError. Использование get предпочтительнее, чем оборачивание в try-except, если не требуется особая логика обработки.
Как объединить два словаря?
В Python 3.9+ появился оператор | для слияния. Раньше использовали распаковку {**d1, **d2} или метод update.
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
merged = d1 | d2 # {'a': 1, 'b': 3, 'c': 4}
# update изменяет исходный словарь
d1.update(d2) # d1 теперь {'a': 1, 'b': 3, 'c': 4}переменная int python какая переменная (переменная int в python - что это?)
При слиянии значения дублирующихся ключей заменяются значениями из второго словаря (или из d2 в операторе |). Оператор | не изменяет исходные словари, в отличие от update.
Как отсортировать словарь по значениям?
Словари сохраняют порядок вставки, но не упорядочены автоматически. Для получения отсортированного по значениям словаря применяется встроенная функция sorted к items().
scores = {'Alice': 90, 'Bob': 75, 'Charlie': 85}
sorted_scores = dict(sorted(scores.items(), key=lambda item: item[1], reverse=True))
# {'Alice': 90, 'Charlie': 85, 'Bob': 75}комплексные числа в python (комплексные числа в python)
Результат sorted - список кортежей. Для обратного преобразования в словарь используется dict(). Обратная сортировка задается параметром reverse=True. С версии Python 3.7 порядок в новом словаре гарантированно сохраняется.
Как создать словарь со значениями по умолчанию для отсутствующих ключей?
Модуль collections предоставляет класс defaultdict, который автоматически вызывает фабричную функцию для отсутствующего ключа.
from collections import defaultdict
# словарь, где значением по умолчанию является пустой список
grouped = defaultdict(list)
grouped['fruits'].append('apple') # создает ключ 'fruits' с пустым списком
print(grouped) # defaultdict(, {'fruits': ['apple']}) Обращение к несуществующему ключу через квадратные скобки в defaultdict создает этот ключ с результатом фабричной функции. Но при использовании get или проверки in ключ не создается. Альтернатива - метод setdefault, но он менее производителен при частых вызовах.
Расширенные примеры работы со словарями
Ниже приведены более сложные сценарии использования словарей с пояснениями и результатами.
1. Словарь для подсчета частоты символов
Классическая задача - подсчет количества вхождений каждого символа в строке. Вместо collections.Counter можно использовать обычный словарь с методом get.
text = 'hello world'
freq = {}
for char in text:
freq[char] = freq.get(char, 0) + 1
print(freq){'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}Метод get позволяет избежать проверки наличия ключа и увеличивает счетчик безопасно.
2. Доступ к вложенным данным с обработкой отсутствующих ключей
Когда словарь содержит другие словари, получение глубоко вложенного значения может привести к KeyError. Используется цепочка вызовов get.
data = {'user': {'profile': {'name': 'Alice'}}}
name = data.get('user', {}).get('profile', {}).get('name', 'не указан')
print(name) # Alice
# Если ключа нет:
age = data.get('user', {}).get('profile', {}).get('age', 'не указан')
print(age) # не указанПри таком подходе каждый промежуточный get возвращает пустой словарь, если ключ отсутствует, что позволяет безопасно двигаться дальше. Альтернатива - использование collections.defaultdict с рекурсивной фабрикой или библиотека dpath.
3. Генератор словаря для фильтрации
С помощью генератора можно создать новый словарь, удовлетворяющий условию фильтрации.
original = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
filtered = {key: value for key, value in original.items() if value % 2 == 0}
print(filtered) # {'b': 2, 'd': 4}Условие может быть любым выражением, включая проверку длины ключа или значение из другого словаря.
4. Мемоизация с помощью словаря
Словарь используется как кэш для результатов рекурсивной функции, например, для вычисления чисел Фибоначчи.
def fib(n, cache={}):
if n in cache:
return cache[n]
if n < 2:
return n
cache[n] = fib(n-1, cache) + fib(n-2, cache)
return cache[n]
print(fib(10)) # 55
print(fib.cache) # словарь с промежуточными результатамиВажно использовать изменяемый словарь по умолчанию с осторожностью: он является общим для всех вызовов функции. В данном примере это уместно, но для большей надежности следует создать словарь вне функции и передавать его явно.
5. Сравнение оператора | и метода update при слиянии
base = {'x': 1, 'y': 2}
extra = {'y': 3, 'z': 4}
a = base | extra
print('оператор |:', a) # {'x': 1, 'y': 3, 'z': 4}
base.update(extra)
print('update:', base) # {'x': 1, 'y': 3, 'z': 4}Оператор | создает новый словарь, не изменяя исходные. Метод update модифицирует исходный словарь. Для неразрушающего слияния используйте | или {**base, **extra}.
6. Глубокое копирование словаря
Поверхностное копирование с помощью copy() не копирует вложенные структуры. Для полной независимости применяется deepcopy из модуля copy.
import copy
original = {'a': [1, 2, 3], 'b': {'c': 4}}
shallow = original.copy()
deep = copy.deepcopy(original)
original['a'].append(4)
original['b']['c'] = 5
print('original:', original) # {'a': [1, 2, 3, 4], 'b': {'c': 5}}
print('shallow:', shallow) # {'a': [1, 2, 3, 4], 'b': {'c': 5}} (изменено!)
print('deep:', deep) # {'a': [1, 2, 3], 'b': {'c': 4}} (независимо)При поверхностном копировании вложенные списки и словари остаются общими для оригинала и копии. Глубокое копирование создает полностью независимую копию всей структуры, но может быть медленным для больших объектов.