我将此输入作为配置文件
a = 1
b = 2
c = 3
dat = 4,5
我正在尝试以上面的输入格式创建嵌套字典(d1 {}),如下所示:
{
"0": {
"a ": "1",
"b ": "2",
"c": "3",
"dat": "4"
},
"1": {
"a ": "1",
"b ": "2",
"c": "3",
"dat": "5"
}
}
下面是我正在使用的python代码,
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"
}
}
正如您在上面所看到的,我无法在'数据集'0&amp ;;的'dat'键中存储不同的值。嵌套dict中的1个,即使在分配列表索引z [0]&的不同值之后,它看起来也是相同的。 Z [1]。 有人可以让我知道我在上面的代码中做了什么错误,因为两个数据集中的值更新都不同。
答案 0 :(得分:1)
问题是python从不隐式地复制对象。 当你这样做
<select ng-model="num" ng-options="lst as lst.AcNo for lst in lstPrint track by lst.AcNo">
<option selected="selected">select</option>
</select>
d1 ['0']和d1 ['1']成为对d的引用。
所以d,d1 ['0']和d1 ['1']指的是相同的对象。
所以当你改变d时,d1 ['0']和d1 ['1']会改变。此外,当您更改d1 ['0']和d1 ['1']时,另一个也会更改。
对于实际创建词典的副本,您可以像这样使用copy()方法:
d1['0'] = d
d1['1'] = d
或者您可以像这样使用dict()函数:
d1['0'] = d.copy()
d1['1'] = d.copy()
答案 1 :(得分:0)
将文本文件解析为多个json配置(使用隐式配置)。
<强> file.txt的强>:
a = 1
b = 2
c = 3
dat = 4,5
执行:
import json
data_file = "file.txt" # as above input data from a file
d = dict()
n_configs = 0
with open(data_file) as f:
for line in f:
key, values = [x.strip() for x in line.split('=')]
values = [x.strip() for x in values.split(',')]
if len(values) > n_configs:
n_configs = len(values)
d[key] = values
configs = dict()
for key, values in d.items():
for n_config, value in enumerate(values):
if n_config not in configs:
configs[n_config] = dict()
configs[n_config][key] = value
n_config, value = len(values), values[-1]
for n_missing_config in range(n_config, n_configs):
if n_missing_config not in configs:
configs[n_missing_config] = dict()
configs[n_missing_config][key] = value
print(json.dumps(configs, indent=4))
输出:
{
"0": {
"a": "1",
"c": "3",
"b": "2",
"dat": "4"
},
"1": {
"a": "1",
"c": "3",
"b": "2",
"dat": "5"
}
}
此解决方案更为通用,给定参数的最后一个配置将是下一个配置的配置(如果缺少)。见:
<强> file.txt的强>:
a = 1,4
b = 2,3
c = 3,6,7
dat = 4
输出:
{
"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"
}
}