在嵌套的Python字典中,为什么最深层的密钥不需要显式实例化?

时间:2014-10-09 19:29:17

标签: python dictionary

数据结构如下所示(通常不按字典排序):

  

{' 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)

3 个答案:

答案 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}

希望这比你给出的例子更具说明性:但我认为你问的问题的简单答案是:

您尝试重新分配整数值,而不是字典键