在Python中向嵌套字典添加新键

4

我需要为嵌套字典中的每个项添加一个值递增的键。我一直在尝试使用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循环的最后一行添加更多层,就会出现回溯错误:
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 我的实际代码太长了,这只是一个摘要。对我来说可以吗? - adohertyd
@senderle请接受我的道歉,我不小心添加了额外的花括号。已经修正了,谢谢。 - adohertyd
@adohertyd:能否给一个期望输出的例子? - Joel Cornett
@JoelCornett 我在回溯代码上方添加了它。 - adohertyd
感谢@adohertyd。如果我理解正确的话,{'result':[{'key1': 'value1', 'index': 0}, {'key1': 'valuex', 'index': 1}]} 是正确的吗? - Joel Cornett
@JoelCornett 是的,完全正确,只是 index 的第一个值是 1 而不是 0 - adohertyd
2个回答

12
问题在于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
1
请注意,由于您感兴趣的对象是一个列表,因此索引是隐含的。如果您已经根据列表中的位置知道索引,我真的想不出为什么您需要向每个带有索引的字典添加键。 - Joel Cornett
@JoelCornett非常好的观点,乔尔。Senderle刚刚让我意识到字典中的列表,所以我没有考虑过那种情况。对于我的程序的大局来说,“index”键将使其他字典保持一致。但你确实提出了一个很好的观点。 - adohertyd

0

我不是完全确定你试图做什么,但我认为 itertools.count 可以帮到你。

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

......等等。

使用这个方法,您可以不断增加要在您的dict中使用的值。

希望这有所帮助。


谢谢,但那不是我要的。我正在向现有字典添加一个新键。当更改/删除键时,不建议使用itertools。 - adohertyd
1
@adohertyd: 为什么使用itertools会是个坏主意? - Joel Cornett
我在某个地方读到,使用itertools来更改键(而不是值)可能会导致运行时错误和其他问题。虽然我可能有些困惑,但我仍在努力掌握Python! - adohertyd
1
@adohertyd:你知道我可以在哪里找到这个吗?有链接吗? - Joel Cornett
1
@JoelCornett 这是来自Python文档:http://docs.python.org/library/stdtypes.html#dict.iteritems 只涉及到iteritems()iterkeys()itervalues()。抱歉,看来itertools没问题。 - adohertyd
在这种特定情况下,您根本没有迭代字典的键,因此这不是问题。 - Joel Cornett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接