Python 根据键中的不同值复制相同数据并创建嵌套dict

Python 根据键中的不同值复制相同数据并创建嵌套dict,python,python-2.7,dictionary,nested,Python,Python 2.7,Dictionary,Nested,我将此输入作为配置文件 a = 1 b = 2 c = 3 dat = 4,5 import json data_file = "Dataset" # as above input data from a file d = {} d1 = {} with open(data_file) as f: for line in f: (key, val) = line.strip().split('=') d[key] = val l1 = d['d

我将此输入作为配置文件

a = 1
b = 2
c = 3
dat = 4,5
import json
data_file = "Dataset" # as above input data from a file
d = {}
d1 = {}
with open(data_file) as f:
    for line in f:
        (key, val) = line.strip().split('=')
        d[key] = val
    l1 =  d['dat']
    z = l1.strip(' ').split(',')
d.pop('dat')

d1['0'] = d
d1['1'] = d

d1['0']['dat']= z[0]
d1['1']['dat']= z[1]
print d1
我试图从上面的输入创建一个嵌套的dict(d1{}),格式如下:

{
    "0": {
        "a ": "1",
        "b ": "2",
        "c": "3",
        "dat": "4"
    },
    "1": {
        "a ": "1",
        "b ": "2",
        "c": "3",
        "dat": "5"
    }
}
下面是我正在使用的python代码,

a = 1
b = 2
c = 3
dat = 4,5
import json
data_file = "Dataset" # as above input data from a file
d = {}
d1 = {}
with open(data_file) as f:
    for line in f:
        (key, val) = line.strip().split('=')
        d[key] = val
    l1 =  d['dat']
    z = l1.strip(' ').split(',')
d.pop('dat')

d1['0'] = d
d1['1'] = d

d1['0']['dat']= z[0]
d1['1']['dat']= z[1]
print d1
这是我得到的输出/结果,如下所示,而不是上面给出的预期结果

{
    "0": {
        "a ": "1",
        "b ": "2",
        "c": "3",
        "dat": "5"
    },
    "1": {
        "a ": "1",
        "b ": "2",
        "c": "3",
        "dat": "5"
    }
}
如上所述,我无法在嵌套dict的“数据集”0和1的“dat”键中存储不同的值,即使在为列表索引z[0]&z[1]分配不同的值后,它似乎也是相同的。
有人能告诉我在上面的代码中我做错了什么,所以在两个数据集中更新的值是不同的。

问题是python从不隐式复制对象。 当你这样做的时候

d1['0'] = d
d1['1'] = d
d1['0']和d1['1']成为对d的引用。
因此d,d1['0']和d1['1']指的是相同的对象。
所以当你改变d时,d1['0']和d1['1']都会改变。另外,当您更改d1['0']和d1['1']中的任何一个时,另一个也会更改

要实际创建词典副本,可以使用dict.copy方法:

d1['0'] = d.copy()
d1['1'] = d.copy()
或者可以使用dict()构造函数:

d1['0'] = dict(d)
d1['1'] = dict(d)

将文本文件解析为多个json配置(使用隐式配置)

file.txt

a = 1
b = 2
c = 3
dat = 4,5
a = 1,4
b = 2,3
c = 3,6,7
dat = 4
做:

输出:

{
    "0": {
        "a": "1",
        "c": "3",
        "b": "2",
        "dat": "4"
    },
    "1": {
        "a": "1",
        "c": "3",
        "b": "2",
        "dat": "5"
    }
}
{
    "0": {
        "a": "1",
        "c": "3",
        "b": "2",
        "dat": "4"
    },
    "1": {
        "a": "4",
        "c": "6",
        "b": "3",
        "dat": "4"
    },
    "2": {
        "a": "4",
        "c": "7",
        "b": "3",
        "dat": "4"
    }
}
此解决方案更一般,给定参数的最后一个配置将是下一个配置的配置(如果缺少)。见:

file.txt

a = 1
b = 2
c = 3
dat = 4,5
a = 1,4
b = 2,3
c = 3,6,7
dat = 4
输出:

{
    "0": {
        "a": "1",
        "c": "3",
        "b": "2",
        "dat": "4"
    },
    "1": {
        "a": "1",
        "c": "3",
        "b": "2",
        "dat": "5"
    }
}
{
    "0": {
        "a": "1",
        "c": "3",
        "b": "2",
        "dat": "4"
    },
    "1": {
        "a": "4",
        "c": "6",
        "b": "3",
        "dat": "4"
    },
    "2": {
        "a": "4",
        "c": "7",
        "b": "3",
        "dat": "4"
    }
}

在第
d1['0']=d行和第d1['1']=d行中,您实际上在这两行中保存了相同的值。@code\u byter:是的,这就是我要创建具有相同数据集的嵌套dict的内容,请参见上面我的预期输出。如果有更好的方法,也请告诉我@shivrk你不明白@code_byter的答案
d1['0']
d1['1']
不是相同的词典,它们是相同的词典-如果您更改
d1['0']['dat']
则与更改
d1['1']['dat']
相同。您的问题要求不清楚。你确定文件中只有一行有多个值吗?那肯定是文件中的最后一行吗?@RoryDaulton:不,它可以是任何一行(但在我的控制下,所以暂时保持最后一行),我只在这里发布了一个示例。我只想创建相同的数据集,其中只有一个值以嵌套dict的形式更改!这就解决了这个问题,也用解释和例子让它更清楚!!很高兴我能帮忙!