python - Python嵌套字典覆盖多个值
问题描述
我有以下嵌套字典:
table_dict = {
"ints": {
"domain highlights": {
"rows": 3000000,
"nulls": 5
},
"range metrics": {
"mean": 0,
"maximum": 0,
"minimum": 0
},
"focus values": {
"1": 0,
"sample_text": 0
}
},
"strings": {
"domain highlights": {
"rows": 3000000,
"nulls": 5
},
"range metrics": {
"mean": 0,
"maximum": 0,
"minimum": 0
},
"focus values": {
"1": 0,
"sample_text": 0
}
},
"floats": {
"domain highlights": {
"rows": 3000000,
"nulls": 5
},
"range metrics": {
"mean": 0,
"maximum": 0,
"minimum": 0
},
"focus values": {
"1": 0,
"sample_text": 0
}
}
}
当我运行这一行时
table_dict["ints"]["range metrics"]["mean"] = 11
,它会更改所有“平均值”值,而不仅仅是“ints”字典中的平均值。这是我的字典在那一行之后的样子
table_dict = {
"ints": {
"domain highlights": {
"rows": 3000000,
"nulls": 5
},
"range metrics": {
"mean": 11,
"maximum": 0,
"minimum": 0
},
"focus values": {
"1": 0,
"sample_text": 0
}
},
"strings": {
"domain highlights": {
"rows": 3000000,
"nulls": 5
},
"range metrics": {
"mean": 11,
"maximum": 0,
"minimum": 0
},
"focus values": {
"1": 0,
"sample_text": 0
}
},
"floats": {
"domain highlights": {
"rows": 3000000,
"nulls": 5
},
"range metrics": {
"mean": 11,
"maximum": 0,
"minimum": 0
},
"focus values": {
"1": 0,
"sample_text": 0
}
}
}
我如何只更改一个值而不是覆盖所有值。是否有单独的方法来更改我需要使用的字典的值?
对于问我如何第一次创建 table_dict 的人:
focus_values = [1, "sample_text"]
table_name = ""
setup = True
col_dict = {"domain highlights": {"rows": 0, "nulls": 0},
"range metrics": {"mean": 0, "maximum": 0, "minimum": 0},
"focus values": {}}
for i in focus_values:
col_dict["focus values"][i] = 0
file = "large_sample_file.csv"
file_df = pd.read_csv(file, chunksize=10000)
for chunk in file_df:
if setup:
setup = False
table_name = chunk.iloc[1, 0] # table name is in column 1
table_dict = {}
for i in chunk.columns[1:]:
table_dict[i] = col_dict
profile_table(chunk, table_dict)
解决方案
从我的评论来看,听起来您在构建 dict 时重新使用了单个引用。您需要为插入的每个值创建一个新的“范围指标”字典。这是一个陷阱的例子。
initial_data = {
"a": 0,
"b": 1,
}
data = {
"c": initial_data,
"d": initial_data,
}
print(data)
data["c"]["a"] = 2
print(data)
{'c': {'a': 0, 'b': 1}, 'd': {'a': 0, 'b': 1}}
{'c': {'a': 2, 'b': 1}, 'd': {'a': 2, 'b': 1}}
您从这段代码中注意到,键c
和d
子键都a
更新了。那是因为两者都c
指向d
同一个引用。IEid(data["c"]) == id(data["d"])
相反,您需要做的是为每个值创建一个新的字典。我建议为此创建一个辅助方法:
def initial_data():
return {
"a": 0,
"b": 1,
}
data = {
"c": initial_data(),
"d": initial_data(),
}
print(data)
data["c"]["a"] = 2
print(data)
现在您将获得预期的结果:
{'c': {'a': 0, 'b': 1}, 'd': {'a': 0, 'b': 1}}
{'c': {'a': 2, 'b': 1}, 'd': {'a': 0, 'b': 1}}
推荐阅读
- asp.net - IIS - 如何将域名屏蔽到另一个域中的特定页面
- bluetooth-lowenergy - BLE STM BlueNrg 特征最大尺寸和每个服务的最大特征
- javascript - Javascript点击位置关闭
- java - 关于并发访问完成时原子布尔值的奇怪行为的问题
- ios - 使用 AR Foundation 检测图像中的人脸
- mysql-workbench - mysql新用户访问数据库被拒绝
- javascript - IE11 不能使用 import * as XXX from XXX
- druid - 如何在apache druid的摄取规范中获取具有最大时间戳的最后一个值?
- r - gsub() 对具有多个替换的数据框中的所有值
- autodesk-forge - OssContriller 无法将文件上传到 BIM 360