На этом шаге мы рассмотрим различные способы задания словаря.
Создать словарь можно следующими способами:
dict(<Ключ1>=<Значение1>[, ..., <КлючN>=<ЗначениеN>]) dict(<Словарь>) dict(<Список кортежей с двумя элементами (Ключ, Значение)>) dict(<Список списков с двумя элементами [Ключ, Значение]>)
>>> d = dict(); d # Создаем пустой словарь {} >>> d = dict(a=1, b=2); d {'a': 1, 'b': 2} >>> d = dict({"a": 1, "b": 2}); d # Словарь {'a': 1, 'b': 2} >>> d = dict([("a", 1), ("b", 2)]); d # Список кортежей {'a': 1, 'b': 2} >>> d = dict([["a", 1], ["b", 2]]); d # Список списков {'a': 1, 'b': 2}
Объединить два списка в список кортежей позволяет функция zip ():
>>> k = ["a", "b"] # Список с ключами >>> v = [1, 2] # Список со значениями >>> list(zip(k, v)) # Создание списка кортежей [('a', 1), ('b', 2)] >>> d = dict(zip(k, v)); d # Создание словаря {'a': 1, 'b': 2}
>>> d = dict(); d # Создание пустого словаря {} >>> d = {"a": 1, "b": 2}; d {'a': 1, 'b': 2}
>>> d = {} # Создаем пустой словарь
>>> d["a"] = 1 # Добавляем элемент 1 (ключ "a")
>>> d["b"] = 2 # Добавляем злемент 2 (ключ "b")
>>> d
{'a': 1, 'b': 2}
>>> d = dict.fromkeys(["a", "b", "c"]) >>> d {'а': None, 'с': None, 'b': None} >>> d = dict.fromkeys(["a", "b", "c"], 0) # Указан список >>> d {'a': 0, 'b': 0, 'c': 0} >>> d = dict.fromkeys(("a", "b", "c"), 0) # Указан кортеж >>> d {'a': 0, 'b': 0, 'c': 0}
При создании словаря в переменной сохраняется ссылка на объект, а не сам объект. Это обязательно следует учитывать при групповом присваивании. Групповое присваивание можно использовать для чисел и строк, но для списков и словарей этого делать нельзя. Рассмотрим пример:
>>> d1 = d2 = {"a": 1, "b": 2} # Якобы создали два объекта
>>> d2["b"] = 10
>>> d1, d2 # Изменилось значение в двух переменных!!!
({'a': 1, 'b': 10}, {'a': 1, 'b': 10})
Как видно из примера, изменение значения в переменной d2 привело также к изменению значения в переменной d1. To есть, обе переменные ссылаются на один и тот же объект, а не на два разных объекта. Чтобы получить два объекта, необходимо производить раздельное присваивание:
>>> d1, d2 = {"a": 1, "b": 2}, {"a": 1, "b": 2}
>>> d2["b"] = 10
>>> d1, d2
({'a': 1, 'b': 2}, {'a': 1, 'b': 10})
Создать поверхностную копию словаря позволяет функция diсt():
>>> d1 = {"a": 1, "b": 2} # Создаем словарь
>>> d2 = dict(d1) # Создаем поверхностную копию
>>> d1 is d2 # Оператор показывает, что это разные объекты
False
>>> d2 ["b"] = 10
>>> d1, d2 # Изменилось только значение в переменной d2
({'a': 1, 'b': 2}, {'a': 1, 'b': 10})
Кроме того, для создания поверхностной копии можно воспользоваться методом сору():
>>> d1 = {"a": 1, "b": 2} # Создаем словарь
>>> d2 = d1.copy() # Создаем поверхностную копию
>>> d1 is d2 # Оператор показывает, что это разные объекты
False
>>> d2 ["b"] = 10
>>> d1, d2 # Изменилось только значение в переменной d2
({'a': 1, 'b': 2}, {'a': 1, 'b': 10})
Чтобы создать полную копию словаря, следует воспользоваться функцией deepcopy() из модуля copy:
>>> d1 = {"a": 1, "b": [20, 30, 40] }
>>> d2 = dict(d1) # Создаем поверхностную копию
>>> d2["b"][0] = "test"
>>> d1, d2 # Изменились значения в двух переменных!!!
({'a': 1, 'b': ['test', 30, 40]}, {'a': 1, 'b': ['test', 30, 40]})
>>> import copy
>>> d3 = copy.deepcopy(d1) # Создаем полную копию
>>> d3["b"][1] = 800
>>> d1, d3 # Изменилось значение только в переменной d3
({'a': 1, 'b': ['test', 30, 40]}, {'a': 1, 'b': ['test', 800, 40]})
На следующем шаге мы рассмотрим операции над словарями.