Python словари: подробный разбор dict и его возможностей

Раздел: Python -> Основы синтаксиса Python

Тип данных 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

Тип данных dict в Python - comments

En
типы данных python dict (python)