添加字典项本身就是字典

时间:2015-08-10 14:50:38

标签: python dictionary

请考虑以下字典:

dict1 = {"A":{"B":"C"}}
print(dict1["A"]["B"])

这会打印'C'

我现在可以像这样修改我的字典

dict1["A"]["B"] = "D"
dict1["A"]["E"] = "F"
dict1["B"] = "G"
print(dict1)

输出

{'A': {'B': 'D', 'E': 'F'}, 'B': 'G'}

但我不能这样做:

dict1["C"]["H"] = ["I"]

然而这有效:

dict2 = {"H":"I"}
dict1["C"] = dict2
print(dict1)

输出:

{'A': {'B': 'D', 'E': 'F'}, 'B': 'G', 'C': {'H': 'I'}}

是否有替代方案不需要创建额外的字典?

我只是在玩弄语言,而不是从事具体项目。 仍然,任何帮助将不胜感激

5 个答案:

答案 0 :(得分:3)

如果dict1中没有元素“C”,为什么dict1 [“C”] [“H”] = [“I”]会工作? 这样做:

dict1["C"] = {}
dict1["C"]["H"] = ["I"]

答案 1 :(得分:2)

您还没有创建字典C。在python中,您必须先编辑它,然后再编辑它。像这样:

dict1 = {}
dict1["C"] = {} # First create it before modifying it
dict1["C"]["H"] = ["I"]
print(dict1)

让我解释一下。

foomain["C"] = 'blah'

设置它,但

foomain['C']['H'] = 'blah'

尝试查找foomain['C'],但失败了。如果它起作用,它将接受该字典并使用其上的赋值运算符将blah分配给['C']['H']

这就像说:

Okay, go find `foomain['C']`, then assign 'blah' to key 'H'

而不是:

Okay, assign 'blah' to `foomain['C']['H']`

换句话说,python中的赋值和获取完全不同。

答案 2 :(得分:1)

dict1["C"]["H"] = ["I"]

在上面,问题是dict1["C"]尚未初始化,因此不知道它是否是dict并且可以分配像["H"]这样的子元素(或者是否只是说,一个整数,分配给["H"]将是一个错误。)

packages to enable what you're talking about,使用defaultdict可以用于单一级别的嵌套。但特别是如果你刚开始,那么明确地处理这些事情可能会更好。

val = dict1.get("C")
if isinstance(val, dict)
    dict1["C"]["H"] = "I"
else
    dict["C"] = {"H": "I"}

答案 3 :(得分:0)

https://gist.github.com/hrldcpr/2012250中有一个单行树。它被发布为一个可爱的黑客,但工作得相当好。

from collections import defaultdict
def tree(): return defaultdict(tree)

users = tree()
users['harold']['username'] = 'hrldcpr'
users['handler']['username'] = 'matthandlersux'

由于defaultdict,对未定义键的每次访问都会生成一个新值,并且由于递归,新值也将是一个新树。

答案 4 :(得分:0)

您可以使用setdefault,它会在出现密钥错误时指定默认值。

dict1.setdefault('C', {})['H'] = 'I'

或者你可以完全使用defaultdict而不是dict。

from collections import defaultdict