Python

Как сделать словарь из списка в Python

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

Например, есть список товаров. Пока товаров мало, можно искать нужный через цикл. Но если часто нужен товар по артикулу, лучше один раз собрать словарь

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

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Список словарей в словарь по id

products = [
    {"id": 101, "title": "Кофе", "price": 790},
    {"id": 102, "title": "Чай", "price": 420},
]

products_by_id = {}

for product in products:
    products_by_id[product["id"]] = product

print(products_by_id[101])

Теперь товар можно получить по id без повторного перебора списка

Через генератор словаря

Когда логика простая, можно записать короче

products_by_id = {
    product["id"]: product
    for product in products
}

print(products_by_id)

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

Что делать с повторами

Если в списке два элемента с одинаковым id, последний перезапишет предыдущий

items = [
    {"id": 1, "title": "первая версия"},
    {"id": 1, "title": "вторая версия"},
]

result = {item["id"]: item for item in items}
print(result)

Если повторы важны, храните список значений по одному ключу

orders = [
    {"user_id": 1, "total": 500},
    {"user_id": 1, "total": 900},
    {"user_id": 2, "total": 300},
]

orders_by_user = {}

for order in orders:
    user_id = order["user_id"]
    orders_by_user.setdefault(user_id, []).append(order)

print(orders_by_user)

Словарь из списка строк

Иногда список содержит простые строки, а значением должен стать номер или длина

words = ["python", "sql", "html"]

lengths = {word: len(word) for word in words}
print(lengths)

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

Практика: индекс задач

tasks = [
    {"slug": "write", "title": "Написать текст"},
    {"slug": "check", "title": "Проверить код"},
]

tasks_by_slug = {
    task["slug"]: task
    for task in tasks
}

print(tasks_by_slug.get("check"))
print(tasks_by_slug.get("publish", "задача не найдена"))

Такой индекс полезен в ботах, меню, небольших CRM, каталогах и парсерах

Частые ошибки

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

Как проверить результат

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

Группировка вместо перезаписи

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

orders = [
    {"city": "Казань", "total": 500},
    {"city": "Москва", "total": 900},
    {"city": "Казань", "total": 1200},
]

orders_by_city = {}

for order in orders:
    city = order["city"]
    orders_by_city.setdefault(city, []).append(order)

print(orders_by_city)

Теперь по ключу лежит не один заказ, а список заказов этого города

Индекс по нескольким полям

Иногда ключ нужно собрать из двух значений. Например, город и дата вместе

visits = [
    {"city": "Казань", "date": "2026-07-01", "count": 10},
    {"city": "Казань", "date": "2026-07-02", "count": 12},
]

index = {}

for row in visits:
    key = (row["city"], row["date"])
    index[key] = row

print(index[("Казань", "2026-07-02")])

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

Когда оставить список

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

Итоговая тренировка: быстрый поиск товара

Сделайте индекс товаров по артикулу и функцию поиска. Если товара нет, функция должна вернуть понятное сообщение

products = [
    {"sku": "coffee-1kg", "title": "Кофе", "price": 790},
    {"sku": "tea-200", "title": "Чай", "price": 420},
]

products_by_sku = {
    product["sku"]: product
    for product in products
}

def find_product(index, sku):
    product = index.get(sku)

    if product is None:
        return "товар не найден"

    return f"{product['title']}: {product['price']} руб."

print(find_product(products_by_sku, "coffee-1kg"))
print(find_product(products_by_sku, "unknown"))

Такой прием встречается в каталогах, складских остатках, меню бота, импорте CSV и небольших CRM

Как не потерять данные

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

Простой тест: сравните длину исходного списка и длину словаря. Если словарь короче, значит часть ключей повторилась

print(len(products))
print(len(products_by_sku))

Проверка на реальных списках по преобразованию списка

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

Для закрепления возьмите список пользователей с городами и сделайте два результата: словарь id -> пользователь и словарь город -> список пользователей. Первый вариант нужен для быстрого поиска одной записи, второй — для группировки. Это две разные задачи, хотя обе решаются через словарь

Что запомнить про создание словаря

Словарь из списка стоит делать только тогда, когда есть понятный ключ. Хорошие ключи: id, артикул, slug, email, код города. Плохие ключи: случайное название, неуникальный статус, поле, которое часто отсутствует. Чем надежнее ключ, тем полезнее итоговый словарь

Для самопроверки попробуйте построить словарь по имени пользователя, а потом добавьте двух пользователей с одинаковым именем. Такой пример сразу показывает, почему технический id обычно надежнее красивого текстового поля

Из списка строк в словарь

rows = ["theme=dark", "language=ru", "limit=20"]
settings = {}

for row in rows:
    key, value = row.split("=", 1)
    settings[key] = value

print(settings)

Такой прием полезен для простых настроек, строк из файла и ручных выгрузок. split("=", 1) ограничивает разделение одним разом, чтобы значение могло содержать дополнительный знак =

Из списка словарей в словарь по id

users = [
    {"id": 10, "name": "Анна"},
    {"id": 11, "name": "Илья"},
]

users_by_id = {user["id"]: user for user in users}
print(users_by_id[10])

Если id повторяется, последняя запись заменит предыдущую. Поэтому перед таким преобразованием полезно проверить, что идентификаторы уникальны

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x