Учебное пособие по словарю Python: методы, примеры и общие шаблоны

  1. Главная
  2. Блог
  3. Разработка программного обеспечения

Разработка программного обеспечения

Учебное пособие по словарю Python: Методы, примеры и общие шаблоны

Словари в Python повсюду: от ответов JSON до конфигурации. Узнайте, как создавать, читать и обновлять их, а затем подобрать шаблоны подсчета, группировки и слияния, которые вы будете использовать в реальных проектах.

9 мин чтения
Учебник по словарю Python: методы, примеры и общие шаблоны

Главное

  • Словарь Python хранит пары ключ-значение и очень быстро ищет значение по ключу.
  • Используйте get(), если ключ может отсутствовать, поскольку квадратные скобки поднимают KeyError.
  • Ключи должны быть хешируемыми, например строки, числа или кортежи. Списки не могут быть ключами.
  • copy() неглубокий, поэтому вложенные данные остаются общими, если вы не используете deepcopy.

Если список представляет собой ряд пронумерованных полей, то словарь Python представляет собой набор помеченных полей. Вы запрашиваете то, что хотите, по имени, а не по должности, поэтому словари стоят за данными JSON, конфигурацией, кэшами и большей частью самого Python.

Это руководство начинается с основ и переходит к шаблонам, которые опытные разработчики используют каждый день. Мы выполнили все примеры на Python 3.13, и показанный результат получен в результате этого запуска.

Что такое словарь?

Словарь, или dict, сопоставляет ключи с значениями. Каждый ключ появляется только один раз, а значения могут быть любыми, включая списки или другие словари.

Тип Доступ через Заказал Дубликаты Лучшее для
список Позиция Да Разрешено Последовательности
кортеж Позиция Да Разрешено Фиксированные рекорды
набор Только членство Нет Не разрешено Уникальные предметы
диктовать Ключ Заказ на размещение Ключи уникальны Поиск по имени

Начиная с Python 3.7, словари официально сохраняют порядок вставки. Во многих старых руководствах они по-прежнему называются неупорядоченными, что уже не соответствует действительности. Для более широкого сравнения других типов см. Список Python, кортеж и набор.

Поиск выполняется быстро, поскольку словари используют хеш-таблицу. Проверка ключа занимает примерно одинаковое время независимо от того, содержит ли словарь десять элементов или миллион, тогда как поиск по списку замедляется по мере его роста.

Создать словарь

user = {"name": "Asha", "age": 31, "city": "Pune"}

empty = {}
from_keywords = dict(name="Asha", age=31)
from_pairs = dict([("a", 1), ("b", 2)])

Фигурные скобки являются наиболее распространенной формой. Одна ловушка: {} создает пустой словарь, а не пустой набор. Для пустого набора вам понадобится set().

Безопасное чтение значений

Есть два способа прочитать значение, и разница имеет значение, когда ключ может не существовать:

user["name"]                  # 'Asha'
user["email"]                 # KeyError: 'email'

user.get("email")             # None
user.get("email", "not set")  # 'not set'

Используйте квадратные скобки, когда ключ должен существовать, чтобы отсутствующий ключ громко выдавал ошибку. Используйте get(), когда отсутствие является нормальным, например, в качестве необязательного поля в ответе API. Чтобы проверить наличие ключа, используйте оператор in, который проверяет ключи, а не значения:

"city" in user    # True
"Pune" in user    # False

Добавляйте, обновляйте и удаляйте

Присвоение ключу обновляет его, если он существует, или добавляет, если его нет:

user["age"] = 32
user["email"] = "asha@example.com"
print(user)

# {'name': 'Asha', 'age': 32, 'city': 'Pune', 'email': 'asha@example.com'}

Python предлагает несколько способов удаления элементов:

user.pop("city")          # returns 'Pune' and removes it
user.pop("phone", None)   # no error if it is missing
del user["email"]         # removes it, and raises KeyError if missing
user.clear()              # empties the dictionary

Используйте pop(), если хотите вернуть значение. Передача значения по умолчанию в качестве второго аргумента позволяет избежать ошибки, когда ключа нет. popitem() удаляет и возвращает последнюю добавленную пару.

Цикл по словарю

Цикл напрямую дает вам ключи. Чтобы получить как ключи, так и значения, используйте items():

user = {"name": "Asha", "age": 32}

for key, value in user.items():
    print(key, "=", value)

# name = Asha
# age = 32

keys(), values() и items() возвращают живые просмотры, а не копии, поэтому они отражают более поздние изменения. Не добавляйте и не удаляйте ключи во время цикла по словарю, поскольку Python вызывает RuntimeError. Если вам нужно это сделать, пройдите по list(user).

Совет: Проверка словаря in выполняется быстро, но "Pune" in user.values() приходится сканировать каждое значение. Если вы часто делаете это с большими данными, ваш словарь может быть настроен неправильно.

Шпаргалка по словарным методам

Метод Что он делает
получить (к, по умолчанию) Возвращает значение или значение по умолчанию, если ключ отсутствует.
keys() Возвращает представление ключей
values() Возвращает представление значений
items() Возвращает представление пар ключ и значение.
update(other) Добавляет или перезаписывает из другого словаря
поп(к, по умолчанию) Удаляет ключ и возвращает его значение
popitem() Удаляет и возвращает последнюю добавленную пару
установить по умолчанию (к, v) Возвращает значение и сначала вставляет v, если ключ отсутствует.
copy() Возвращает неполную копию
clear() Удаляет все
dict.fromkeys(ключи, v) Создает словарь из списка ключей

Объединить словари

Распространенной необходимостью является применение пользовательских настроек поверх значений по умолчанию. При столкновении ключей побеждает правая сторона:

defaults = {"theme": "light", "lang": "en"}
saved = {"theme": "dark"}

defaults | saved
{**defaults, **saved}

# Both give: {'theme': 'dark', 'lang': 'en'}

Для оператора | требуется Python 3.9 или новее, а версия ** работает и в более старых версиях. Оба создают новый словарь. Напротив, defaults.update(saved) и defaults |= saved заменяют defaults на месте.

Понимание и сортировка

Словарные генераторы создают новый словарь в одной читаемой строке, точно так же, как списковые генераторы делают это для списков:

prices = {"pen": 10, "book": 250, "bag": 900}

{k: v for k, v in prices.items() if v > 100}
# {'book': 250, 'bag': 900}

Для сортировки по значению передайте функцию key в sorted(). Чтобы найти ключ с наибольшим значением, используйте max():

sorted(prices.items(), key=lambda item: item[1], reverse=True)
# [('bag', 900), ('book', 250), ('pen', 10)]

max(prices, key=prices.get)
# 'bag'

В словаре нет метода sort(), а sorted() возвращает список пар. Оберните результат в dict(), если вам нужен словарь в таком порядке.

Подсчет и группировка узоров

Постоянно возникают две задачи. Первый — подсчет, который вы можете выполнить, используя get() со значением по умолчанию, равным нулю:

words = "to be or not to be".split()

counts = {}
for word in words:
    counts[word] = counts.get(word, 0) + 1

print(counts)
# {'to': 2, 'be': 2, 'or': 1, 'not': 1}

Стандартная библиотека делает это еще короче с помощью Counter:

from collections import Counter

Counter(words).most_common(2)
# [('to', 2), ('be', 2)]

Второй — группировка, и defaultdict здесь идеален, потому что он создает недостающее значение:

from collections import defaultdict

orders = [("Asha", 1200), ("Ben", 300), ("Asha", 800)]

by_customer = defaultdict(list)
for name, total in orders:
    by_customer[name].append(total)

print(dict(by_customer))
# {'Asha': [1200, 800], 'Ben': [300]}

Без него вам пришлось бы проверять, существует ли каждый ключ перед добавлением. Эти же шаблоны хорошо работают для агрегирования данных API или строк журнала. Если словарь пуст или ключ отсутствует, в нашем руководстве по обработке исключений Python показано, как действовать в результате KeyError.

Вложенные данные и ловушка копирования

JSON напрямую сопоставляется с вложенными словарями и списками, поэтому вам часто придется связывать ключи. Цепочка get() обеспечивает безопасность, когда уровень может отсутствовать:

response = {"user": {"profile": {"city": "Pune"}}}

response["user"]["profile"]["city"]               # 'Pune'
response.get("user", {}).get("settings", {}).get("theme")   # None

Будьте осторожны при копировании вложенных данных. copy() дублирует только верхний уровень, поэтому внутренние словари остаются общими с оригиналом:

settings = {"db": {"host": "localhost"}}

shallow = settings.copy()
shallow["db"]["host"] = "prod"

print(settings["db"]["host"])
# prod

Изменение копии изменило оригинал, что может быть неприятной ошибкой. Используйте copy.deepcopy(settings), чтобы получить полностью независимую копию.

Что может быть словарным ключом?

Ключи должны быть хэшируемыми, что обычно означает неизменяемые. Строки, числа и кортежи неизменяемых значений работают. Списки и словари не:

{["a"]: 1}

# TypeError: unhashable type: 'list'

Причина в том, что хэш ключа решает, где хранить его значение. Если бы ключ мог измениться, Python больше не смог бы его найти. Если вам нужен составной ключ, используйте кортеж, например {("Pune", 2026): 120}.

Распространенные ошибки

  • Использование квадратных скобок для дополнительных клавиш. Нажмите get(), если клавиша может отсутствовать.
  • Предполагая, что get() означает, что ключ существует. None может означать отсутствие или сохраненное None. Используйте in, когда разница имеет значение.
  • Использование изменяемого значения по умолчанию. dict.fromkeys(names, []) дает каждому ключу один и тот же список. Вместо этого используйте понимание.
  • Изменение размера во время итерации. Перебираем копию ключей.
  • Использование dict для фиксированных, известных полей. dataclass может быть более понятным и выявлять опечатки в именах полей.

Итоги

Словари вознаграждают за небольшую практику. Помните get() для дополнительных клавиш, items() для циклов и Counter и defaultdict для двух наиболее распространенных заданий. Для практики возьмите небольшой файл JSON и напишите код для подсчета и группировки его записей. Если вы новичок в этом языке, начните с нашего Урока Python для начинающих.

Часто задаваемые вопросы

Что такое словарь в Python?

Словарь — это встроенная коллекция, в которой хранятся пары ключ-значение. Вы ищете значение по его ключу, что происходит быстро даже при большом объеме данных.

Заказаны ли словари Python?

Да. Начиная с Python 3.7, словари гарантированно сохраняют порядок вставки ключей. Обновление существующего ключа не меняет его положения.

В чем разница между get() и квадратными скобками?

Квадратные скобки вызывают ошибку KeyError, когда ключ отсутствует. get() возвращает None или значение по умолчанию, которое вы предоставляете, поэтому оно подходит для необязательных ключей.

Может ли словарь иметь повторяющиеся ключи?

Нет. Каждый ключ уникален. Присвоение существующему ключу заменяет его значение, и если литерал повторяет ключ, побеждает последнее значение.

Как объединить два словаря в Python?

Используйте | b в Python 3.9 или новее или {**a, **b} в более старых версиях. Оба создают новый словарь, и значения из b выигрывают, когда ключи конфликтуют.

Продолжайте учиться

Работайте с Stack Quora

Нужна помощь с тестированием, WordPress или SEO?

Мы помогаем командам выпускать лучшее программное обеспечение и развивать свои сайты. Расскажите нам, над чем вы работаете, и мы предложим четкий следующий шаг.

Продолжайте читать

Больше руководств по тестирование, искусственный интеллект и современные разработки

Понравилась эта статья? Выберите тему и сразу приступайте к нашим новейшим руководствам.

Искусственный интеллект

Объяснение галлюцинаций искусственного интеллекта: почему языковые модели все выдумывают и как их уменьшить

Галлюцинации ИИ объяснили: что это такое, почему языковые модели их создают, распространенные типы, как уменьшить их с помощью заземления и подсказо…

Читать статью →
DevOps

Объяснение переменных среды: файлы .env, секреты и правильно выполненная конфигурация

Переменные среды объясняются на примерах Python, которые мы запускали: их чтение и установка, почему каждое значение является строкой, файлы .env, н…

Читать статью →
Разработка ПО

Объяснение ограничения скорости API: алгоритмы, заголовки и обработка ошибок 429

Ограничение скорости API объясняется с помощью проведенного нами моделирования: сегмент токенов, фиксированное окно, скользящее окно, 429 ответов, з…

Читать статью →
Автоматизация тестирования

Издевательство в Python: unittest.mock, патч и ошибки, из-за которых тесты лгут

Издевательство на Python с помощью unittest.mock, протестировано: Mock и return_value, Side_effect, исправление использования имени, спецификация и …

Читать статью →
Тестирование ПО

Объяснение покрытия кода: покрытие линий или ветвей и что на самом деле означает 100%

Покрытие кода объяснено с помощью реального запуска покрытия.py: покрытие строк, ветвей и условий, чтение отчета, почему 100%-ное покрытие все еще м…

Читать статью →
Базы данных и SQL

DELETE, TRUNCATE и DROP в SQL: различия, откат и когда использовать каждый из них

Объяснение DELETE, TRUNCATE и DROP на примере протестированного SQL: что каждый из них удаляет, откат, триггеры, сброс идентификаторов, скорость и ч…

Читать статью →
Базы данных и SQL

Объяснение представлений SQL: создавайте, используйте и избегайте ловушек, с примерами

Представления SQL, объясненные с помощью запросов, которые мы выполняли: создание представления, результаты в реальном времени, скрытие столбцов, пр…

Читать статью →
Разработка ПО

Интерфейс TypeScript и тип: реальные различия, протестированные с помощью компилятора

Интерфейс TypeScript против типа, проверенный реальным компилятором: что могут делать оба, что может делать только один, слияние объявлений, расшире…

Читать статью →
Разработка ПО

Объяснение Python *args и **kwargs: гибкие функции с понятными примерами

Python *args и **kwargs, объясненные с помощью кода, который мы запускали: упаковка и распаковка, порядок параметров, аргументы только по ключевым с…

Читать статью →
Разработка ПО

Лямбда-функции Python: синтаксис, реальное использование и когда их не следует использовать

Лямбда-функции Python, объясненные с помощью кода, который мы запускали: синтаксис, сортировка с помощью ключа, карты и фильтра, замыкания, ловушка …

Читать статью →
Искусственный интеллект

Что такое ИИ-агенты? Как они работают: можно запустить простой цикл агента

Что такое агенты ИИ? Простое руководство по циклу агента, инструментам, памяти и ограничениям, с небольшим циклом Python, который мы запустили, реал…

Читать статью →
DevOps

Мониторинг и наблюдаемость: реальная разница с журналами, метриками и трассировками

Объяснение мониторинга и наблюдаемости: известные и неизвестные сбои, журналы, метрики и трассировки, пошаговое руководство по инцидентам при оформл…

Читать статью →
DevOps

Docker Volumes против Bind Mounts: правильное сохранение данных контейнера

Объяснение томов Docker и монтирования привязки: почему исчезают данные контейнера, именованные тома, монтирование привязки, tmpfs, примеры создания…

Читать статью →
Автоматизация тестирования

TDD против BDD: ключевые различия, одна функция, созданная для обоих способов, и когда использовать каждый

TDD и BDD объясняются с помощью одной функции скидки, созданной в обоих направлениях: красно-зеленый рефакторинг с кодом, который мы запускали, сцен…

Читать статью →
Тестирование ПО

Пользовательское приемочное тестирование (UAT): процесс, контрольный список и реальные примеры

Приемочное тестирование пользователей объяснило: кто его проводит, чем оно отличается от контроля качества, семиэтапный процесс, шаблон тестового сц…

Читать статью →
Базы данных и SQL

Объяснение значений NULL в SQL: IS NULL, COALESCE, NULLIF и ловушки, которых следует избегать

Значения SQL NULL объяснены с помощью запросов, которые мы выполнили: трехзначная логика, IS NULL, COALESCE, NULLIF, как агрегаты, соединения и сорт…

Читать статью →
Базы данных и SQL

Оператор SQL CASE WHEN: синтаксис, реальные примеры и распространенные ошибки

SQL CASE WHEN объяснен с помощью запросов, которые мы выполняли: простые формы и формы для поиска, порядок условий, повороты с помощью SUM, трюки CO…

Читать статью →
Разработка ПО

Что такое JWT? Веб-токены JSON, объясненные на рабочем примере

Что такое JWT? Объяснение JSON Web Tokens: три части: токен, созданный и измененный в коде, который мы запускали, JWT и сеансы, хранилище, токены об…

Читать статью →
Разработка ПО

Объяснение цикла событий JavaScript: стек вызовов, микрозадачи и таймеры с примерами

Цикл событий JavaScript объясняется с помощью кода, который мы запускали: стек вызовов, очереди задач и микрозадач, почему setTimeout 0 не является …

Читать статью →
Разработка ПО

Генераторы Python и объяснение доходности: экономьте память с помощью реальных примеров

Генераторы Python и доходность, объясненные с помощью кода, который мы запускали: как они приостанавливаются и возобновляются, измеряют экономию пам…

Читать статью →
Искусственный интеллект

Что такое вложения? Простое объяснение векторов и косинусного сходства

Что такое вложения? Простое руководство по векторам, косинусному подобию и семантическому поиску с небольшим примером, который мы использовали, общи…

Читать статью →
DevOps

Сине-зеленое и канареечное развертывание: различия, компромиссы и как выбрать

Объяснение сине-зеленого и канареечного развертывания: как каждый из них работает, стоимость, риски и откат, стабильное группирование пользователей,…

Читать статью →
Автоматизация тестирования

Ненадежные тесты: что их вызывает и как их исправить навсегда

Ненадежные тесты объясняются на демонстрациях, которые мы запускали: основные причины, способы подтверждения и диагностики, правильные исправления в…

Читать статью →
Тестирование ПО

Нагрузочное тестирование и стресс-тестирование: различия, метрики и примеры k6

Объяснение нагрузочного и стресс-тестирования: что доказывает каждое из них, тесты на всплески и выдержки, важные метрики, почему средние значения в…

Читать статью →
Тестирование ПО

Тестовый пример и тестовый сценарий: ключевые различия, примеры и когда использовать каждый

Объяснение тестового случая и тестового сценария: четкие определения, параллельная таблица, одна функция сброса пароля, взятая из сценариев в случаи…

Читать статью →
Базы данных и SQL

Оптимизация SQL-запросов: чтение планов выполнения и исправление медленных запросов с указанием времени

Оптимизация SQL-запросов проверена на миллионе строк: читайте планы выполнения, добавляйте правильные индексы, исправляйте неразмещаемые фильтры, ис…

Читать статью →
Базы данных и SQL

SQL UNION против UNION ALL: различия, примеры и проверка производительности

SQL UNION и UNION ALL объяснены с помощью запросов, которые мы выполнили: дубликаты, правила, которым следуют оба, реальная ошибка данных, измеренна…

Читать статью →
Разработка ПО

Учебное пособие по API JavaScript Fetch: GET, POST, обработка ошибок и тайм-ауты

Учебное пособие по API JavaScript Fetch, протестированное на локальном сервере: GET и POST, почему не выдается ошибка 404, многоразовый помощник, ст…

Читать статью →
Разработка ПО

Обработка файлов Python: чтение, запись, CSV, JSON и pathlib с примерами

Обработка файлов Python объясняется с помощью кода, который мы запускали: открытые режимы, чтение больших файлов, CSV, JSON, pathlib, двоичные файлы…

Читать статью →
Разработка ПО

Классы и объекты Python: учебник ООП с реальными примерами

Классы и объекты Python, объясненные с помощью кода, который мы запускали: __init__, методы, атрибуты класса и экземпляра, наследование, свойства, м…

Читать статью →
Искусственный интеллект

Что такое большая языковая модель? Как работают LLM, объяснено без шумихи

Что такое большая языковая модель? LLM объясняется простым языком: токены, встраивания, внимание, обучение, температурные и контекстные окна, крошеч…

Читать статью →
DevOps

Команды Linux для начинающих: основное руководство по терминалу с примерами

Команды Linux для начинающих, сгруппированные по задачам: навигация, файлы, просмотр журналов, grep, каналы, разрешения, процессы и архивы, с практи…

Читать статью →
Автоматизация тестирования

Selenium vs Playwright: ключевые различия, сравнение кода и что выбрать

Сравнение Selenium и Playwright: архитектура, ожидание, поддержка браузера и языка, отладка, одинаковый тест в обоих инструментах, советы по миграци…

Читать статью →
Тестирование ПО

Разделение эквивалентности: метод проектирования тестов, объясненный на рабочих примерах

Объяснение эквивалентного разделения: как найти действительные и недействительные разделы, рабочие примеры для возрастов, паролей и купонов, проведе…

Читать статью →
Тестирование ПО

Серьезность и приоритет в тестировании программного обеспечения: различия, матрица и реальные примеры

Объяснение серьезности и приоритета при тестировании программного обеспечения: четкие определения, четырехсторонняя матрица с примерами, шкалы уровн…

Читать статью →
Базы данных и SQL

Учебное пособие по подзапросам SQL: типы, коррелирующие подзапросы и EXISTS с примерами

Руководство по подзапросам SQL с выполненными нами запросами: скалярные подзапросы, IN, FROM и SELECT, коррелированные подзапросы, EXISTS, ловушка N…

Читать статью →
Базы данных и SQL

Объяснение транзакций SQL и ACID: COMMIT, ROLLBACK и уровни изоляции

Транзакции SQL и ACID, объясненные с помощью банковского перевода, который мы выполнили: COMMIT, ROLLBACK, точки сохранения, блокировки, уровни изол…

Читать статью →
Разработка ПО

Git Commands Cheat Sheet: The Commands You Actually Use, With Examples

Шпаргалка по командам Git, сгруппированная по задачам: настройка, промежуточный этап, ветки, удаленные устройства, тайник, история и исправление оши…

Читать статью →
Разработка ПО

Объяснение промисов в JavaScript: then, catch, Promise.all и распространенные ошибки

Обещания JavaScript, объясненные с помощью кода, который мы запускали: состояния, цепочки then и catch, обработка ошибок, Promise.all, allSettled, R…

Читать статью →
Разработка ПО

Учебное пособие по словарю Python: методы, примеры и общие шаблоны

Учебное пособие по словарю Python с кодом, который мы выполнили: создание, чтение и обновление словарей, ключевые методы, слияние, понимание, шаблон…

Читать статью →
Искусственный интеллект

Что такое РАГ? Генерация с расширенным поиском, объясненная на рабочем примере

Что такое РАГ? Retrieval-augmented generation explained step by step: indexing, chunking, embeddings, retrieval, a small working Python example, eva…

Читать статью →
DevOps

Учебное пособие по Terraform для начинающих: инфраструктура как код от первого файла до модулей

Учебное пособие по Terraform для начинающих: начните без облачной учетной записи, изучите инициализацию, планирование и применение, затем переменные…

Читать статью →
DevOps

Docker и Kubernetes: ключевые различия, как они работают вместе и что вам нужно

Объяснение Docker и Kubernetes: что делает каждый из них, одно и то же приложение работает с обоими, сравнение Docker Compose и Swarm, изменение doc…

Читать статью →
Автоматизация тестирования

Учебное пособие по Pytest для начинающих: фикстуры, параметризация и реальные примеры

Учебное пособие по pytest для начинающих с тестами, которые мы запускали на pytest 9.2: утверждения, фикстуры, параметризация, conftest, маркеры, tm…

Читать статью →
Тестирование ПО

Жизненный цикл тестирования программного обеспечения (STLC): 6 этапов, критерии входа и выхода, пример

Объясняется жизненный цикл тестирования программного обеспечения: шесть этапов STLC с критериями входа и выхода, результаты, пример проработанной фу…

Читать статью →
Разработка ПО

Git merge vs rebase: отличия, примеры и когда что использовать

Git merge vs rebase с реальным выводом log, сравнительной таблицей, золотым правилом rebase и безопасным рабочим процессом для команды.

Читать статью →
Разработка ПО

Генераторы списков в Python: синтаксис, примеры и когда их избегать

Генераторы списков в Python: синтаксис, фильтры, if-else, вложенные циклы, измеренное время и случаи, когда обычный цикл for лучше.

Читать статью →
Базы данных и SQL

SQL JOIN: объяснение с примерами (Inner, Left, Right, Full)

Разберите SQL JOIN шаг за шагом на примерах таблиц и запросов: INNER, LEFT, RIGHT, FULL, CROSS и SELF, а также частые ошибки и советы по производите…

Читать статью →