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的形式更改!这就解决了这个问题,也用解释和例子让它更清楚!!很高兴我能帮忙!