Python словари: подробный разбор dict и его возможностей
Тип данных dict в Python
Словарь (dict) в Python представляет собой неупорядоченную коллекцию пар «ключ-значение». Ключи должны быть уникальными и хэшируемыми (например, строки, числа, кортежи), значения могут быть любого типа. Словари широко применяются для хранения структурированных данных, работы с базами данных, конфигурациями и быстрого доступа по ключу.
Основное решение: создание, доступ, изменение
Самый простой способ создать словарь — использовать фигурные скобки и пары ключ: значение:
person = {
"name": "Анна",
"age": 30,
"city": "Москва"
}
print(person)Python ввод слов (ввод слов с клавиатуры в python)
{'name': 'Анна', 'age': 30, 'city': 'Москва'}ключевое слово def в python (ключевое слово def в python)
Доступ к значению осуществляется по ключу в квадратных скобках. Если ключа нет, возникает ошибка KeyError:
print(person["name"]) # Анна
# print(person["country"]) # KeyErrorкоманды в программе python (команды в программе python)
Добавление или изменение значения:
person["age"] = 31
person["job"] = "инженер"
print(person)типы данных python dict (тип данных dict в python)
{'name': 'Анна', 'age': 31, 'city': 'Москва', 'job': 'инженер'}Python первая программа (первая программа на python)
Основные методы: keys(), values(), items() для итерации, len() для количества элементов.
Как создать словарь из списка ключей и значений?
Использование встроенной функции dict() с различными аргументами: из списка кортежей, из zip-объекта, или с помощью метода fromkeys.
# из списка пар
pairs = [("a", 1), ("b", 2)]
d1 = dict(pairs)
# из zip
keys = ["x", "y"]
values = [10, 20]
d2 = dict(zip(keys, values))
# fromkeys (все значения одинаковы)
d3 = dict.fromkeys(["red", "green", "blue"], 0)
print(d1, d2, d3, sep='\n')Python программа (программа на языке python)
{'a': 1, 'b': 2}
{'x': 10, 'y': 20}
{'red': 0, 'green': 0, 'blue': 0}как сделать переменную в python (создание переменной в python)
Проблема:
При использовании fromkeys все ключи ссылаются на один и тот же объект-значение. Если значением является изменяемый объект (список), его изменение затронет все ключи. Лучше использовать dict comprehension для копирования.
d = dict.fromkeys([1,2], [])
d[1].append('a')
print(d) # {1: ['a'], 2: ['a']}как сделать строку python (создание строки в python)
Как получить значение без ошибки, если ключа нет?
Методы get() и setdefault() позволяют задать значение по умолчанию. get() возвращает значение или None (или другое), не изменяя словарь. setdefault() вставляет ключ с умолчанием, если его нет, и возвращает значение.
d = {"a": 1}
print(d.get("b")) # None
print(d.get("b", 0)) # 0
print(d.setdefault("c", 3)) # 3, теперь d = {'a':1, 'c':3}как сделать цикл в python (создание цикла в python)
Типичная ошибка:
Путаница между get() и setdefault(). setdefault() изменяет словарь, get() — нет.
Как объединить два словаря?
Метод update() добавляет пары из другого словаря, перезаписывая существующие ключи. В Python 3.9+ появился оператор | для создания нового словаря.
d1 = {"a": 1, "b": 2}
d2 = {"b": 3, "c": 4}
d1.update(d2)
print(d1) # {'a':1, 'b':3, 'c':4}
# оператор |
d3 = {"x": 10}
d4 = {"y": 20}
combined = d3 | d4
print(combined) # {'x':10, 'y':20}слова в python в переменную (сохранение слов в переменную python)
Как удалить элемент из словаря?
Удаление по ключу: del dict[key] или pop(key, default) (возвращает значение). popitem() удаляет и возвращает последнюю вставленную пару (в Python 3.7+ словари упорядочены). clear() очищает весь словарь.
d = {"a": 1, "b": 2, "c": 3}
del d["a"]
val = d.pop("b")
print(val, d) # 2 {'c': 3}
last = d.popitem()
print(last, d) # ('c',3) {}True b false python (true и false в python)
Ошибка:
Удаление несуществующего ключа через del вызывает KeyError. Для безопасного удаления используйте pop() с умолчанием.
Как пройти по всем ключам и значениям?
Цикл for key in dict итерирует по ключам. Для одновременного получения пар используйте .items().
d = {"питон": "язык", "java": "платформа"}
for lang, desc in d.items():
print(f"{lang}: {desc}")переменная k в python (переменная k в python)
питон: язык java: платформа
Как создать словарь с помощью генератора?
Dict comprehension позволяет компактно создавать словари из итераций, применяя выражение к каждому элементу.
squares = {x: x**2 for x in range(5)}
print(squares) # {0:0, 1:1, 2:4, 3:9, 4:16}
# с фильтром
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # {0:0, 2:4, 4:16, 6:36, 8:64}Проблема:
Если ключи не уникальны, последнее значение перезапишет предыдущие. Также используйте dict comprehension только для простых преобразований, чтобы не снижать читаемость.
Расширенные примеры работы со словарями
defaultdict из модуля collections
Автоматически создает значение по умолчанию для отсутствующих ключей. Удобно при группировке данных.
from collections import defaultdict
data = [('a', 1), ('b', 2), ('a', 3)]
grouped = defaultdict(list)
for key, val in data:
grouped[key].append(val)
print(dict(grouped)) # {'a': [1, 3], 'b': [2]}{'a': [1, 3], 'b': [2]}OrderedDict (упорядоченный словарь)
До Python 3.7 словари не гарантировали порядок. OrderedDict сохраняет порядок вставки, а также имеет методы для переупорядочивания (move_to_end).
from collections import OrderedDict
od = OrderedDict()
od['z'] = 1
od['a'] = 2
od['m'] = 3
for k in od:
print(k, end=' ') # z a m
print()
od.move_to_end('a')
print(list(od.keys())) # ['z', 'm', 'a']Counter для подсчета элементов
Подкласс dict для подсчета повторяющихся объектов. Возвращает частоту элементов.
from collections import Counter
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
cnt = Counter(words)
print(cnt) # Counter({'apple': 3, 'banana': 2, 'orange': 1})
print(cnt.most_common(2)) # [('apple', 3), ('banana', 2)]Сортировка словаря
Словари нельзя отсортировать на месте, но можно получить отсортированный список пар или новый упорядоченный словарь.
d = {'c': 3, 'a': 1, 'b': 2}
# по ключам
sorted_by_key = dict(sorted(d.items()))
print(sorted_by_key) # {'a':1, 'b':2, 'c':3}
# по значениям
sorted_by_val = dict(sorted(d.items(), key=lambda item: item[1]))
print(sorted_by_val) # {'a':1, 'b':2, 'c':3}Вложенные словари
Значением может быть другой словарь. Доступ к вложенным данным требует цепочки ключей. get() полезен для безопасного извлечения.
users = {
'user1': {'name': 'Alice', 'age': 25},
'user2': {'name': 'Bob', 'age': 30}
}
print(users['user1']['name']) # Alice
# безопасный доступ
alice = users.get('user1', {}).get('name', 'unknown')
print(alice) # AliceОбъединение вложенных словарей (глубокое слияние)
Стандартный update не объединяет вложенные словари рекурсивно. Для глубокого слияния требуется кастомная функция или библиотека.
def deep_merge(d1, d2):
result = d1.copy()
for key, val in d2.items():
if key in result and isinstance(result[key], dict) and isinstance(val, dict):
result[key] = deep_merge(result[key], val)
else:
result[key] = val
return result
a = {'x': 1, 'y': {'a': 10}}
b = {'y': {'b': 20}, 'z': 3}
merged = deep_merge(a, b)
print(merged) # {'x':1, 'y':{'a':10,'b':20}, 'z':3}{'x': 1, 'y': {'a': 10, 'b': 20}, 'z': 3}Копирование словаря (поверхностное и глубокое)
Поверхностная копия (dict.copy() или dict(d)) не копирует вложенные объекты. Для полной независимости используется deepcopy из copy.
import copy
original = {'key': [1, 2, 3]}
shallow = original.copy()
deep = copy.deepcopy(original)
shallow['key'].append(4)
print(original) # {'key': [1, 2, 3, 4]}
print(deep) # {'key': [1, 2, 3]}Словарь и JSON
Модуль json позволяет сериализовать/десериализовать словари (ключи должны быть строками).
import json
data = {'name': 'Иван', 'age': 35, 'languages': ['Python', 'Java']}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
# {"name": "Иван", "age": 35, "languages": ["Python", "Java"]}
parsed = json.loads(json_str)
print(parsed['name']) # Иван{"name": "Иван", "age": 35, "languages": ["Python", "Java"]}
ИванИспользование ChainMap для объединения множества словарей
ChainMap из модуля collections объединяет несколько словарей в одно представление без копирования. Поиск происходит последовательно.
from collections import ChainMap
defaults = {'color': 'red', 'size': 'medium'}
user_settings = {'color': 'blue'}
combined = ChainMap(user_settings, defaults)
print(combined['color']) # blue (из user_settings)
print(combined['size']) # medium (из defaults)Словарь с вычисляемыми значениями (lazy evaluation)
С помощью defaultdict можно отложить вычисление значения до момента обращения.
from collections import defaultdict
import math
def compute_sqrt(n):
print(f"Вычисление sqrt({n})")
return math.sqrt(n)
cache = defaultdict(compute_sqrt)
print(cache[4]) # вычислит и запомнит 2.0
print(cache[4]) # теперь просто вернет 2.0 без вызова функцииВычисление sqrt(4) 2.0 2.0