gpt4 book ai didi

python - 从键列表中获取 JSON 对象

转载 作者:行者123 更新时间:2023-11-28 22:38:35 24 4
gpt4 key购买 nike

我有一个动态构建的字典,看起来像这样:

my_dict = {"ministry": {
"of": {
"silly": {
"walks": {}
}
}
},
"foo": "bar",
"spam": {
"ministry": {
"of": "silly"
}
}
}

然后我有一个键列表,它是我要查找的对象的地址,如下所示:

my_keys = ["ministry", "of", "silly", "walks"]

使用 my_keys 到达 my_dict 中的位置的最佳方法是什么。在那里我还想添加一个新条目。

思考和谷歌搜索了好几天,但没有找到任何东西,我唯一能想到的就是将其重新制作为 XML 对象。

我想做类似的事情

my_dict[my_keys[0]][my_keys[1]][my_keys[2]][my_keys[3]] = {"new":"entry"}

但我永远不知道 my_keys 列表中有多少项。你们会如何解决这个问题?


编辑 1:基于Pauls回答我这样做

def get(json_object, path):
if type(path) == str:
path = path.split(".")

if type(path) != list or len(path) == 0:
return

key = path.pop(0)

if len(path) == 0:
try:
return json_object[key]
except KeyError:
return

if len(path):
return get(json_object[key], path)

然后像这样使用:

my_found_item = get(my_dict, my_keys)
if my_found_item:
my_found_item["new"] = "entry"

print(my_dict)

如果 my_keys 是这样的,这会起作用:

my_keys = ["ministry", "of", "silly"]

但是如果 my_keys 像这样一直下降,它将无法工作

my_keys = ["ministry", "of", "silly", "walks"]

my_found_item = get(my_dict, my_keys)
if my_found_item:
my_found_item["new"] = "entry"

有谁知道如何解决这个“小”问题?


编辑 2这当然是因为我需要检查 my_found_item 是否不为空。此更改修复了它:

if my_found_item is not None:
my_found_item["new"] = "entry"

用答案 here 回答了我自己的问题

最佳答案

使用递归。

你想要的函数已经写在一个名为 dotty 的 Javascript 库中.现在你不能简单地将 JS 复制并粘贴到 python 中,你需要做一些翻译。这里要注意的是技术。

特别是他们编写了一个 .get() 函数,该函数将在对象的深处查找用包含点的字符串定义的路径,例如 ministry.of.silly.walks

实现源码为here :

var get = module.exports.get = function get(object, path) {  if (typeof path === "string") {    path = path.split(".");  }  if (!(path instanceof Array) || path.length === 0) {    return;  }  path = path.slice();  var key = path.shift();  if (typeof object !== "object" || object === null) {    return;  }  if (path.length === 0) {    return object[key];  }  if (path.length) {    return get(object[key], path);  }};
  1. 该函数旨在将字符串或数组作为参数 (path),并确定它是哪个。
  2. 描述字符串 ministry.of.silly.walks 上拆分。 以获得存储在路径中的数组(即路径现在设置为 ['部','的','傻','走']
  3. path 的第一个元素被path.shift() 移除并放入key 中,用于访问一个级别对象(object[key])。
  4. 如果描述符超出级别 (path.length === 0),我们就完成并找到了元素 (object[key])。如果不是,我们将降级对象(object[key])和路径数组的剩余部分递归访问返回获取(return get(object[key], path) ).

此递归方法适用于任何语言。我想你会发现 python 有 .shift() 并且对于 .slice() 你想在 python 中替换一个复制操作,它可以是 path = path [:]path = copy.copy(path)。如果您想在找到对象中的正确位置后添加新条目,则需要为此添加参数并将它们复制到递归调用中。

关于python - 从键列表中获取 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com