Python: уроки, справочник и задачи

dict в Python 3: как создать словарь конструктором

Раздел: Словари в Python · Обновлено 31.10.2026

dict в Python 3 - это встроенный тип словаря и одновременно конструктор dict(), который собирает словарь из разных источников данных. С его помощью словарь получают из именованных аргументов, списка пар, двух списков через zip() или копируют из другого словаря. Ниже разобраны все формы вызова, типичные ошибки и случаи, когда удобнее фигурные скобки.

dict python 3
Фото: Eberhard Kieser / Daniel Meisner / Public domain, Wikimedia Commons
Содержание статьи
  1. Три формы вызова dict()
  2. Словарь из именованных аргументов
  3. Словарь из последовательности пар
    1. Два списка через zip()
  4. Копия и слияние словарей
  5. dict() или фигурные скобки
  6. Требования к ключам
  7. Частые вопросы
    1. Как создать словарь из строки вида "a=1;b=2"?
    2. Как превратить JSON-строку в словарь?
    3. Можно ли передать в dict() список списков?
    4. Что будет при повторяющихся ключах?

Три формы вызова dict()

Конструктор принимает не больше одного позиционного аргумента и любое количество именованных. Документация описывает три варианта сигнатуры:

dict(**kwargs)
dict(mapping, **kwargs)
dict(iterable, **kwargs)

Без аргументов dict() возвращает пустой словарь. Результат всегда новый объект, даже если передан уже существующий словарь. Общие сведения о словарях, доступе к элементам и переборе собраны в статье словари в Python.

Словарь из именованных аргументов

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

user = dict(name="Олег", age=28, active=True)
print(user)  # {'name': 'Олег', 'age': 28, 'active': True}

empty = dict()
print(empty, type(empty))  # {} <class 'dict'>

У способа есть ограничения, о которых стоит помнить:

С Python 3.7 словарь сохраняет порядок вставки, поэтому ключи идут в том порядке, в котором написаны аргументы.

Словарь из последовательности пар

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

pairs = [("x", 5), ("y", -5)]
print(dict(pairs))          # {'x': 5, 'y': -5}
print(dict(pairs, z=8))     # {'x': 5, 'y': -5, 'z': 8}
print(dict(["ab", "cd"]))   # {'a': 'b', 'c': 'd'} - строка из двух символов тоже пара

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

dict([("a", 1, 2)])
# ValueError: dictionary update sequence element #0 has length 3; 2 is required

Два списка через zip()

Когда ключи и значения хранятся в разных списках, их склеивают функцией zip(). Она останавливается на самом коротком списке, поэтому лишние элементы молча отбрасываются. В Python 3.10+ параметр strict=True превращает разную длину в ошибку.

keys = ["x", "y", "z"]
values = [1, 2, 3]
print(dict(zip(keys, values)))  # {'x': 1, 'y': 2, 'z': 3}

fruits = ["яблоко", "груша"]
print(dict(enumerate(fruits, start=1)))  # {1: 'яблоко', 2: 'груша'}

Подробнее о параллельном переборе рассказано в статье zip и map в Python.

Копия и слияние словарей

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

defaults = {"theme": "light", "lang": "ru"}
settings = dict(defaults, theme="dark")
print(settings)  # {'theme': 'dark', 'lang': 'ru'}
print(defaults)  # {'theme': 'light', 'lang': 'ru'} - не изменился

nested = {"tags": ["a"]}
copy = dict(nested)
copy["tags"].append("b")
print(nested)    # {'tags': ['a', 'b']} - вложенный список общий

Для полной независимой копии применяют copy.deepcopy(). Слить два словаря без конструктора можно оператором | (Python 3.9+) или методом update(), его поведение описано на странице методы словаря.

dict() или фигурные скобки

Один и тот же словарь можно создать несколькими способами. Выбор зависит от того, откуда берутся данные.

СпособПримерКогда удобен
литерал{"a": 1, 1: "b"}данные известны заранее, ключи любого типа
dict(**kwargs)dict(a=1, b=2)ключи - простые строки
dict(iterable)dict(zip(k, v))пары уже собраны в другой структуре
генератор словаря{w: len(w) for w in words}значения вычисляются по ключу
dict.fromkeys()dict.fromkeys("abc", 0)у всех ключей одно начальное значение

Литерал {} работает немного быстрее, чем dict(): для него интерпретатор выполняет одну инструкцию, а для конструктора ищет имя dict и вызывает функцию. Разница заметна только в циклах на миллионы итераций, поэтому в обычном коде выбирают то, что лучше читается.

Требования к ключам

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

ok = dict([((55.75, 37.62), "Москва")])  # кортеж подходит
print(ok)

dict([([1, 2], "x")])
# TypeError: unhashable type: 'list'

Есть и неочевидный момент: 1, 1.0 и True равны и имеют одинаковый хеш, поэтому считаются одним ключом. Запись dict([(1, "a"), (True, "b")]) вернет {1: 'b'}. Значения при этом могут быть любыми, включая списки и другие словари.

Частые вопросы

Ответы на вопросы о создании словарей через dict().

Как создать словарь из строки вида "a=1;b=2"?

Разбейте строку и передайте пары в конструктор: dict(item.split("=") for item in s.split(";")). Значения при этом останутся строками.

Как превратить JSON-строку в словарь?

dict() для этого не подходит. Используйте json.loads(), как показано в статье про модуль json.

Можно ли передать в dict() список списков?

Да, если каждый вложенный список содержит ровно два элемента: dict([["a", 1], ["b", 2]]) вернет {'a': 1, 'b': 2}.

Что будет при повторяющихся ключах?

Ошибки не будет: последнее значение перезапишет предыдущее. Исключение составляет повтор одного и того же именованного аргумента, он вызывает SyntaxError.