【问题标题】:Adding a new key to a nested dictionary in python在python中向嵌套字典添加新键
【发布时间】:2012-07-07 10:25:55
【问题描述】:

我需要为嵌套字典中的每个项目添加一个值加一的键。我一直在尝试使用 dict['key']='value' 语法,但无法让它适用于嵌套字典。我敢肯定这是一个非常简单的。

我的字典:

mydict={'a':{'result':[{'key1':'value1','key2':'value2'},
                        {'key1':'value3','key2':'value4'}]}}

这是将键添加到字典主要部分的代码:

for x in range(len(mydict)):
        number = 1+x
        str(number)
        mydict[d'index']=number

print mydict
  #out: {d'index':d'1',d'a'{d'result':[...]}}

我想将新的键和值添加到方括号内的小字典中:

{'a':{'result':[{'key1':'value1',...,'index':'number'}]}}

如果我尝试在 for loop 的最后一行添加更多层,我会收到回溯错误:

Traceback (most recent call last):
  File "C:\Python27\program.py", line 34, in <module>
    main()
  File "C:\Python27\program.py", line 23, in main
    mydict['a']['result']['index']=number
TypeError: list indices must be integers, not unicode

我尝试了各种不同的方法来列出嵌套项,但没有任何乐趣。有谁能帮帮我吗?

【问题讨论】:

  • @senderle 我的实际代码太长了,这是一个总结。适合我吗?
  • @senderle 请接受我的道歉,我错误地添加了额外的大括号。现在修改谢谢。
  • 太棒了!谢谢指正。
  • @adohertyd:希望输出的示例怎么样?
  • @JoelCornett 我在回溯代码上方添加了它

标签: python dictionary


【解决方案1】:

问题在于mydict 不仅仅是嵌套字典的集合。它还包含一个列表。分解定义有助于澄清内部结构:

dictlist = [{'key1':'value1','key2':'value2'},
            {'key1':'value3','key2':'value4'}]
resultdict = {'result':dictlist}
mydict = {'a':resultdict}

所以要访问最里面的值,我们必须这样做。向后工作:

mydict['a'] 

返回resultdict。那么这个:

mydict['a']['result']

返回dictlist。那么这个:

mydict['a']['result'][0]

返回dictlist 中的第一项。最后,这个:

mydict['a']['result'][0]['key1']

返回'value1'

所以现在您只需修改您的 for 循环以正确迭代 mydict。可能有更好的方法,但这是第一种方法:

for inner_dict in mydict['a']['result']: # remember that this returns `dictlist`
    for key in inner_dict:
        do_something(inner_dict, key)

【讨论】:

  • 啊,我明白了,是的,既然您指出了这一点,那就很明显了。您的代码非常有意义。非常感谢
  • @adohertyd:请注意,由于您感兴趣的对象是一个列表,因此索引是隐式的。如果您已经根据列表中的位置知道索引,我真的想不出为什么您必须为每个带有索引的 dict 添加一个键。
  • @JoelCornett 非常好,Joel。 Senderle 只是让我知道字典中的列表,所以没有想到那种情况。对于我的程序的更大图景,index 键将保持与我的其他字典一致。但你确实提出了一个很好的观点
【解决方案2】:

我不完全确定您要做什么,但我认为itertools.count 可以在这里提供帮助。

>>> c = itertools.count()
>>> c.next()
0
>>> c.next()
1
>>> c.next()
2
>>> c.next()
3

...等等。

使用它,您可以不断增加要在dicts 中使用的值

希望对你有帮助

【讨论】:

  • 谢谢,但不是这样。我正在向现有字典添加一个新键。更改/删除键时不建议使用 itertools
  • @adohertyd:为什么使用 itertools 是个坏主意?
  • 我在某处读到使用 itertools 更改键(而不是值)会导致运行时错误和其他问题。虽然我可能会感到困惑,但我仍在掌握 Python!
  • @adohertyd:知道在哪里可以找到这个吗?可能是链接?
  • @JoelCornett 它来自 Python 文档:docs.python.org/library/stdtypes.html#dict.iteritems 仅指 iteritems()iterkeys()itervalues() 抱歉,itertools 似乎没问题
猜你喜欢
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2020-08-17
  • 2010-11-04
相关资源
最近更新 更多