首先,我无法找到任何建议来解决我的问题以解决我的问题,所以如果有人已经回复,请善意向我发言。
我正在尝试“动态”创建由其他词典组成的词典(最后一个是通过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'}
}
有人可以向我说明正确的方向吗? 感谢
答案 0 :(得分: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 :(得分:1)
这是一个常见的错误。 D2中的每个键都被分配给同一个对象D1。然后你每次迭代都要继续修改D1。
您希望在每次迭代时分配不同的字典。将D1 = {}
添加到for循环的第一行。
答案 2 :(得分:1)
这可能是因为你指的是for循环中的同一个dict D1。我认为你必须在每次迭代中创建新的dict。像这样:
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
答案 3 :(得分: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