Словари Python: практическое руководство с разнообразными примерами
Основы работы со словарями в Python
Словарь (dict) - это неупорядоченная коллекция пар «ключ - значение». Ключи должны быть уникальными и неизменяемыми (строки, числа, кортежи). Ниже показан наиболее эффективный способ создания словаря и базовые операции.
# Создание словаря с помощью литерала
user = {
"name": "Анна",
"age": 25,
"city": "Москва"
}
print(user)проверить является ли числом python (проверка, является ли значение числом в python)
{'name': 'Анна', 'age': 25, 'city': 'Москва'}что делает strip в python (метод strip() в python)
Доступ к значению по ключу:
print(user["name"])
математические примеры python (математические примеры в python)
Анна
новые возможности условного оператора python (новые возможности условного оператора в python)
Добавление или изменение элемента:
user["email"] = "anna@example.com"
print(user)Float python пример (примеры float в python)
{'name': 'Анна', 'age': 25, 'city': 'Москва', 'email': 'anna@example.com'}Python кортежи примеры (примеры кортежей в python)
Удаление по ключу:
del user["age"]
print(user)словарь в python пример (примеры словарей в python)
{'name': 'Анна', 'city': 'Москва', 'email': 'anna@example.com'}является ли число четным python (проверка числа на четность в python)
Распространённые ошибки:
- Обращение к несуществующему ключу вызывает KeyError. Используйте метод
.get()для безопасного доступа. - Попытка использовать изменяемый тип (например, список) в качестве ключа приводит к TypeError.
Как создать словарь с помощью функции dict()?
# Из последовательности пар
pairs = [("a", 1), ("b", 2)]
d = dict(pairs)
print(d)типы данных в python с примерами (типы данных в python с примерами)
{'a': 1, 'b': 2}множественный выбор python (множественный выбор (if-elif-else) в python)
Проблема: дублирующиеся ключи - последнее значение перезаписывает предыдущее.
Как безопасно получить значение по ключу, избежав ошибки?
data = {"x": 42}
print(data.get("y", "значение не найдено"))
значение не найдено
Метод .get() возвращает значение по умолчанию, если ключа нет.
Как объединить два словаря или обновить один другим?
d1 = {"a": 1, "b": 2}
d2 = {"b": 3, "c": 4}
d1.update(d2)
print(d1)
{'a': 1, 'b': 3, 'c': 4}
В Python 3.9+ также доступен оператор |:
merged = d1 | d2
print(merged)
Проблема: существующие ключи в d1 перезаписываются значениями из d2. Если нужно сохранить исходные, лучше создать копию.
Как удалить элемент и получить его значение?
d = {"one": 1, "two": 2, "three": 3}
val = d.pop("two")
print(val, d)
2 {'one': 1, 'three': 3}
.popitem() удаляет и возвращает последнюю добавленную пару (с Python 3.7 порядок сохраняется).
Как перебрать словарь в цикле?
person = {"name": "Иван", "job": "инженер"}
# По ключам
for key in person:
print(key, person[key])
# По парам
for key, value in person.items():
print(key, value)
# Только значения
for value in person.values():
print(value)
Как создать словарь с помощью генератора (словарного включения)?
# Квадраты чисел
squares = {x: x**2 for x in range(1, 6)}
print(squares)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Можно добавлять условия:
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}
Как использовать defaultdict для автоматического создания значений по умолчанию?
from collections import defaultdict
# Список как значение по умолчанию
dd = defaultdict(list)
dd["fruits"].append("apple")
dd["fruits"].append("banana")
print(dd)
defaultdict(<class 'list'>, {'fruits': ['apple', 'banana']})
Полезно для группировки данных.
Как подсчитать количество элементов с помощью Counter?
from collections import Counter
colors = ["red", "blue", "red", "green", "blue", "blue"]
count = Counter(colors)
print(count)
Counter({'blue': 3, 'red': 2, 'green': 1})
Как создать упорядоченный словарь (OrderedDict)?
from collections import OrderedDict
od = OrderedDict()
od["first"] = 1
od["second"] = 2
print(od)
OrderedDict([('first', 1), ('second', 2)])
Начиная с Python 3.7 обычный dict тоже сохраняет порядок вставки, но OrderedDict предоставляет дополнительные методы, такие как .move_to_end().
Как проверить, существует ли ключ в словаре?
d = {"a": 1}
print("a" in d, "b" in d)
True False
Оператор in проверяет только ключи.
Как получить список ключей, значений или пар?
d = {"x": 10, "y": 20}
print(list(d.keys()))
print(list(d.values()))
print(list(d.items()))
['x', 'y']
[10, 20]
[('x', 10), ('y', 20)]
В Python 3 возвращаются представления (view objects), которые динамически отражают изменения словаря.
Как очистить словарь?
d = {1: "one"}
d.clear()
print(d)
{}
Как создать словарь из двух списков (ключи и значения)?
keys = ["a", "b", "c"]
values = [1, 2, 3]
zipped = dict(zip(keys, values))
print(zipped)
{'a': 1, 'b': 2, 'c': 3}
Проблема: если длины разные, zip обрезает до минимальной.
Расширенные примеры со словарями
Вложенные словари
# Хранение структурированных данных
company = {
"employees": {
"john": {"age": 30, "role": "developer"},
"jane": {"age": 28, "role": "designer"}
},
"location": "NYC"
}
print(company["employees"]["jane"]["role"])
designer
Сортировка словаря по ключам и значениям
data = {"z": 3, "a": 1, "c": 2}
# По ключам
sorted_by_keys = dict(sorted(data.items()))
print("По ключам:", sorted_by_keys)
# По значениям
sorted_by_values = dict(sorted(data.items(), key=lambda item: item[1]))
print("По значениям:", sorted_by_values)
По ключам: {'a': 1, 'c': 2, 'z': 3}
По значениям: {'a': 1, 'c': 2, 'z': 3}
Слияние словарей с сохранением исходных значений
d1 = {"a": 1, "b": 2}
d2 = {"b": 99, "c": 3}
# Сохранение значений из d1 при конфликте
merged = {**d2, **d1} # d1 перезаписывает d2
print(merged)
# Или наоборот: merged = {**d1, **d2}
{'b': 2, 'c': 3, 'a': 1}
Словарь как аналог switch-case
def action(operation):
switcher = {
"add": lambda a, b: a + b,
"substract": lambda a, b: a - b,
"multiply": lambda a, b: a * b,
"divide": lambda a, b: a / b if b != 0 else "деление на ноль"
}
func = switcher.get(operation, lambda a, b: "неизвестная операция")
return func(10, 5)
print(action("add"))
print(action("divide"))
15 2.0
Работа с JSON и словарями
import json
data = {"name": "Alex", "age": 30}
json_str = json.dumps(data, indent=2)
print("JSON строка:")
print(json_str)
# Обратно в словарь
restored = json.loads(json_str)
print("Восстановленный словарь:", restored)
JSON строка:
{
"name": "Alex",
"age": 30
}
Восстановленный словарь: {'name': 'Alex', 'age': 30}
Использование целых чисел и кортежей в качестве ключей
# Числовые ключи
numeric = {1: "one", 2: "two"}
print(numeric[1])
# Кортежи как ключи (например, для координат)
points = {(0, 0): "origin", (1, 2): "point A"}
print(points[(1, 2)])
one point A
Словарь с множествами значений (setdefault)
data = [("fruit", "apple"), ("fruit", "banana"), ("drink", "water")]
d = {}
for category, item in data:
d.setdefault(category, []).append(item)
print(d)
{'fruit': ['apple', 'banana'], 'drink': ['water']}
Обратная сортировка и ограничение
scores = {"Alice": 85, "Bob": 72, "Charlie": 95}
# Топ-2 по убыванию
sorted_items = sorted(scores.items(), key=lambda x: x[1], reverse=True)[:2]
top_two = dict(sorted_items)
print(top_two)
{'Charlie': 95, 'Alice': 85}
Словарь из значений перечисления (enum)
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
color_map = {c.name: c.value for c in Color}
print(color_map)
{'RED': 1, 'GREEN': 2, 'BLUE': 3}
Объединение вложенных словарей с помощью ChainMap
from collections import ChainMap
d1 = {"a": 1, "b": 2}
d2 = {"b": 3, "c": 4}
chain = ChainMap(d1, d2)
print(chain["a"], chain["b"], chain["c"]) # при поиске сначала d1
1 2 4
Копирование словаря (поверхностное и глубокое)
import copy
original = {"x": [1, 2], "y": 3}
# Поверхностная копия
shallow = original.copy()
shallow["x"].append(99)
print(original["x"]) # изменения видны в оригинале
# Глубокая копия
deep = copy.deepcopy(original)
deep["x"].append(100)
print(original["x"]) # оригинал не изменился
[1, 2, 99] [1, 2, 99]