数据结构如下所示(通常不按字典排序):
{' b':{' 2':0.02},' a':{' 1':0.01}}
在Python中创建这样的字典时,不检查是否''在引用d [" b"]之前存在。虽然添加密钥' 2'但这并不正确。使用d [" b"] [" 2"] = float(0.02)键入由' b'键入的词典。
下面是解释这种情况的代码。忽略两条注释行,代码分割一行文本并构造嵌套字典;换句话说,字典的字典。
如果d是简单字典(没有嵌套),则两条注释行有效。没有必要检查是否' a'和' b'存在。
会有什么解释?
def f():
d = {}
m = ["a 1 0.01", "b 2 0.02"]
#d["a"] = 1
#d["b"] = 2
for i in range(2):
(m0,m1,m2) = m[i].split()
if m0 not in d:
d[m0] = {}
d[m0][m1] = float(m2)
答案 0 :(得分:4)
区别在于
d["b"] = 2
代表电话d.__setitem__("b", 2)
,而
print d["b"]
代表
d.__getitem__("b")
如果“b”不是dict
中的关键字,那么第一个只是添加密钥,而第二个则会引发KeyError
。
你的行,
d["b"]["2"] = float(0.02)
但是,从左到右进行评估。它的解析与
相同(d["b"])["2"] = float(0.02)
表示d.__getitem__("b")
必须成功才能调用__setitem__
。它相当于
d.__getitem__("b").__setitem__("2", float(0.02))
顺便说一句,如果Python支持真正的“多维”词典,那么d["b"]["2"] = float(0.02)
之类的内容会映射到类似d.__setitem__("b", "2", float(0.02))
的内容,并且大多数defaultdict
的使用都将变得不必要。
答案 1 :(得分:1)
如果我理解你的问题是对的,原因是d['b']['2']
由两个操作组成:一个执行d['b']
而另一个执行...['2']
,其中...
是d['b']
的结果。本身没有“嵌套字典”的概念;你只需要从外面一个接一个地访问dicts。
在d['b']['2'] = 'blah'
之类的操作中,只有最后一个操作(...['2'] = 'blah'
)是设置操作。另一个是读取操作,只读取d['b']
的值。如果您注意到,此操作将失败,如果d['b']
不存在。
换句话说,d['b']['2'] = 'blah'
与:
x = d['b']
x['2'] = 'blah'
您似乎意识到如果d['b']
不存在,第一个操作将失败。这也是d['b']['2'] = 'blah'
失败的原因。
答案 2 :(得分:-1)
def f():
d = {}
m = ["a 1 0.01", "b 2 0.02"]
for i in range(2):
(m0,m1,m2) = m[i].split()
if m0 not in d:
d[m0] = {}
d[m0][m1] = float(m2)
print d
print type(d)
print type(m)
print (d['a']['1'])
print type (d['a']['1'])
print (d['a'])
print (d['b'])
f()
给出输出:
{' a':{' 1':0.01},' b':{' 2':0.02}}
键入' dict'
键入' list'
0.01
键入' float'
{' 1':0.01}
{' 2':0.02}
希望这比你给出的例子更具说明性:但我认为你问的问题的简单答案是:
您尝试重新分配整数值,而不是字典键