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

时间:2017-06-29 11:06:34

标签: python python-2.7 dictionary nested

我将此输入作为配置文件

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]。 有人可以让我知道我在上面的代码中做了什么错误,因为两个数据集中的值更新都不同。

2 个答案:

答案 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"
    }
}