Возникли проблемы при определении функции, которая облегчит создание словаря - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь создать функцию player_def, которая немного облегчит создание словаря.

Глядя на это сейчас, это, вероятно, немного глупо, потому что я могу просто сделать players["betts"]["avg"]=340, верно?В любом случае, чтобы понять, как работает Python, я был бы признателен, если кто-нибудь из вас сможет объяснить, почему следующий код возвращает ключевую ошибку вместо создания вложенного словаря.

def player_def(x,y,z):
  players[x][y]=z
player_def("betts","avg",340)
print(players["betts"])

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Самым простым решением было бы использование collection.defaultdict :

from collections import defaultdict

players = defaultdict(dict)

def player_def(x,y,z):
    players[x][y] = z

player_def("betts","avg",340)
print(players["betts"])
# {'avg': 340}

Мы определяем players как defaultdict из dict.Когда мы делаем:

players["betts"]["avg"] = 340

, если players еще не имеет ключа betts, новый создается на лету с пустым dict в качестве значения.Таким образом, мы можем добавить "avg": 340 к этому новому диктату.

0 голосов
/ 09 марта 2019

Вы имеете в виду это?Извините, но мой запрос не отвечает на вашу проблему в комментарии, поэтому мне пришлось поместить его в качестве возможного решения / объяснения.

>>> d={}
>>> d
{}
>>> d['a'] = {'b' : {'c','d','e'} }
>>> d
{'a': {'b': {'c', 'e', 'd'}}}
>>>
>>> d['a']['b']
{'c', 'e', 'd'}

/// РЕДАКТИРОВАТЬ: Так, когда словарь ужесуществует, то вы можете изменить его содержимое.Однако, если вы хотите добавить новую пару (справа от существующего ключа), вы должны добавить к существующему ключу несуществующий, чуть выше синтаксиса.Думаю, я объяснил это сложно, извините.

>>> d['a']['b'] = "4"
>>> d
{'a': {'b': '4'}}
>>> d['a']['b'] = ["4","test","hello"]
>>> d
{'a': {'b': ['4', 'test', 'hello']}}
>>> d['a']['b'] = (1,2,3,4)
>>> d
{'a': {'b': (1, 2, 3, 4)}}
>>>

Еще один пример из консоли Python:

>>> test = {}
>>> test['betts']['avg'] = 300
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'betts'
>>> test['betts'] = {}
>>> test['betts']['avg'] = 300
>>> test
{'betts': {'avg': 300}}
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...