【问题标题】:copying same data and creating nested dict,as per the different values in keys根据键中的不同值复制相同的数据并创建嵌套字典
【发布时间】:2017-12-03 01:17:45
【问题描述】:

我将此输入作为配置文件

a = 1
b = 2
c = 3
dat = 4,5

我正在尝试从上面的输入中创建如下格式的嵌套 dict(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"
    }
}

正如您在上面看到的,我无法在嵌套 dict 的“数据集”0 和 1 的“dat”键中存储不同的值,即使在分配了不同的列表索引值 z [ 0] & z[1]。 有人可以让我知道我在上面的代码中做错了什么,因此两个数据集中的值更新是不同的。

【问题讨论】:

  • d1['0'] = d and d1['1'] = d 行中,您实际上是在两者中保存相同的值。
  • @code_byter :是的,这就是我想要创建具有相同数据集的嵌套字典的内容,请参阅上面的预期输出。如果有更好的方法,也请告诉我!
  • @shivrk 你不明白@code_byter 的回答。 d1['0']d1['1'] 不是相同 字典,它们是相同 字典- 如果您更改d1['0']['dat'],则与更改d1['1']['dat'] 相同。
  • 您的问题要求不明确。你确定你只会在文件中得到一个包含多个值的行,而且那肯定是文件中的最后一行吗?
  • @RoryDaulton:不,它可以是任何一行(但在我的控制范围内,所以暂时保留它),我只在这里发布了一个示例。我只想创建相同的数据集,它只会以嵌套字典的形式更改一个值。

标签: python python-2.7 dictionary nested


【解决方案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)

【讨论】:

  • 谢谢你!这解决了这个问题,也有解释和例子使它更清楚!
  • 很高兴能帮上忙!
【解决方案2】:

将文本文件解析为多个 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"
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    相关资源
    最近更新 更多