Python 动态创建字典的字典
首先,我找不到任何建议来解决我接下来的问题,所以如果有人已经回答过这个问题,请告诉我一下。
我想要“动态”创建一个字典,这个字典里面包含其他字典(这些字典的数据是通过json获取的);总之,我想要达到的结果是这样的:
{
'D2Key1': {'D1Key1': 'Data11', 'D1Key2': 'Data21', 'D1Key3': 'Data31'},
'D2Key2': {'D1Key1': 'Data12', 'D1Key2': 'Data22', 'D1Key3': 'Data32'},
'D2Key3': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'}
}
我写的代码是:
for n in range(3):
D1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n
D1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n
D1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n
D2['%s%d' % ('D2key', n+1)] = D1
我得到的结果是一个字典,里面有三个字典,但它们的数据都是一样的,都是最后一次循环的结果,换句话说,结果看起来像这样:
{
'D2Key1': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'},
'D2Key2': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'},
'D2Key3': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'}
}
有没有人能给我指个方向?谢谢!
4 个回答
0
这一行
D2['%s%d' % ('D2key', n+1)] = D1
是错的。你总是指向那个字典,而字典是可以改变的类型。你需要先复制结果,然后再把它加到字典 D2 里。
试试这样,在每次循环中创建一个新的字典,填入键值,然后再把它加到字典 D2 里。
for n in range(3):
d1 = {} # notice here this is what you need to add.
d1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n
d1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n
d1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n
d2['%s%d' % ('D2key', n+1)] = d1
1
是的,如果你这样做的话,每次循环后都需要重置 D1。否则,指针会保持不变,这样 D2 中的所有键都会指向同一个 D1。下面是解决这个问题的方法:
for n in range(3):
D1 = {}
D1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n
D1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n
D1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n
D2['%s%d' % ('D2key', n+1)] = D1
1
这可能是因为你在循环里一直在用同一个字典 D1。我的建议是每次循环时都创建一个新的字典。可以像这样做:
for n in range(3):
D1 = {}
D1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n
D1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n
D1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n
D2['%s%d' % ('D2key', n+1)] = D1
1
这是一个常见的错误。你在D2中的每个键都被分配到了同一个对象D1上。然后你在每次循环中都在修改D1。
你其实是想在每次循环中分配一个不同的字典。可以在你的for循环的第一行加上D1 = {}
。