На этом шаге мы рассмотрим различные способы задания словаря.
Создать словарь можно следующими способами:
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]})
На следующем шаге мы рассмотрим операции над словарями.