python动态创建dicts的词典

时间:2014-04-30 17:14:19

标签: python loops dictionary

首先,我无法找到任何建议来解决我的问题以解决我的问题,所以如果有人已经回复,请善意向我发言。

我正在尝试“动态”创建由其他词典组成的词典(最后一个是通过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 :(得分: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