fromkeys()
dict.fromkeys(iterable, value) создаёт словарь, где все ключи получают одно и то же значение. Если value не передать, будет None.
keys = ["x", "y", "z"]
defaults = dict.fromkeys(keys)
print(defaults)
roles = dict.fromkeys(["admin", "editor"], "pending")
print(roles)Главная ловушка: если value - изменяемый объект, все ключи будут ссылаться на один и тот же объект.
keys = ["a", "b", "c"]
bad = dict.fromkeys(keys, [])
bad["a"].append(1)
print(bad)get() и setdefault()
get() читает значение без KeyError. Если ключ отсутствует, возвращается default или None.
user = {"name": "Alice", "age": 30}
print(user.get("city"))
print(user.get("city", "Unknown"))setdefault() похож на get(), но при отсутствии ключа добавляет его в словарь.
groups = {}
name = "Alice"
group = "Python"
groups.setdefault(group, []).append(name)
print(groups)keys(), values(), items()
Эти методы возвращают view objects. Представление связано со словарём и отражает изменения.
user = {"name": "Alice", "age": 30}
keys = user.keys()
print(keys)
user["city"] = "New York"
print(keys)
keys_snapshot = list(keys)
user["country"] = "USA"
print(keys_snapshot)Для обхода пар используйте items(): это самый читаемый вариант, когда нужны и ключ, и значение.
Вложенные структуры и копирование
Словарь может хранить списки, другие словари и множества. Доступ строится цепочкой ключей и индексов.
school = {
"class1": {"students": ["Alice", "Bob"], "teacher": "Mrs. Smith"},
"class2": {"students": ["David"], "teacher": "Mr. Johnson"},
}
print(school["class2"]["teacher"])
school["class1"]["students"].append("Daisy")
print(school["class1"]["students"])copy() создаёт новый внешний словарь, но вложенные списки остаются общими. Для независимой копии используйте copy.deepcopy().
import copy
original = {"name": "Alice", "scores": [90, 85, 88]}
shallow = original.copy()
deep = copy.deepcopy(original)
original["scores"].append(80)
print(shallow)
print(deep)Dict comprehension и сравнение словарей
Dict comprehension создаёт словарь из выражений для ключа и значения.
numbers = [1, 2, 3, 4]
squares = {number: number ** 2 for number in numbers}
print(squares)
data = {"a": 5, "b": 2, "c": 0, "d": 3}
positive = {key: value for key, value in data.items() if value > 0}
print(positive)Словари можно сравнивать на равенство и неравенство. Порядок добавления не влияет на результат сравнения.