请考虑以下字典:
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'}}
是否有替代方案不需要创建额外的字典?
我只是在玩弄语言,而不是从事具体项目。 仍然,任何帮助将不胜感激
答案 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