修改给定 "path" 的嵌套字典中的元素
Modify an element in a nested dict given a "path" to it
给定索引列表(任意长度)的 "path" 和嵌套的 Python list
/dict
对象,我如何写入列表中对象的一部分?
例如,这可能是我的对象(它是从 JSON 文件加载的):
data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
我的索引列表可能看起来像 ["dogs", 0, "properties"]
。
如果我想检索路径中的值,我可以这样做:
>>> data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
>>> path = ["dogs", 0, "properties"]
>>> mydata = data
>>> for i in path:
... mydata = mydata[i]
...
>>> mydata
{'test': 1}
但是说我想在整个结构中修改路径处的对象?上面的代码是按值传递的,而不是按引用传递的,所以我认为我不能重用它。我能做什么?
这可能是一个不错的替代选择,但我发现 jsonpath-rw
库是在 JSON 结构内导航和搜索的好方法:
>>> from jsonpath_rw import jsonpath, parse
>>>
>>> data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
>>>
>>> jsonpath_expr = parse("dogs.[0].properties")
>>> jsonpath_expr.find(data)[0].value['test'] = 2
>>> print(data)
{'dogs': [{'tail': True, 'properties': {'test': 2}}]}
请注意,您在显示的代码中仍有 "by reference" 行为:
>>> data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
>>>
>>> path = ["dogs", 0, "properties"]
>>> mydata = data
>>> for i in path:
... mydata = mydata[i]
...
>>> mydata["test"] = 2
>>> print(data)
{'dogs': [{'tail': True, 'properties': {'test': 2}}]}
给定索引列表(任意长度)的 "path" 和嵌套的 Python list
/dict
对象,我如何写入列表中对象的一部分?
例如,这可能是我的对象(它是从 JSON 文件加载的):
data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
我的索引列表可能看起来像 ["dogs", 0, "properties"]
。
如果我想检索路径中的值,我可以这样做:
>>> data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
>>> path = ["dogs", 0, "properties"]
>>> mydata = data
>>> for i in path:
... mydata = mydata[i]
...
>>> mydata
{'test': 1}
但是说我想在整个结构中修改路径处的对象?上面的代码是按值传递的,而不是按引用传递的,所以我认为我不能重用它。我能做什么?
这可能是一个不错的替代选择,但我发现 jsonpath-rw
库是在 JSON 结构内导航和搜索的好方法:
>>> from jsonpath_rw import jsonpath, parse
>>>
>>> data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
>>>
>>> jsonpath_expr = parse("dogs.[0].properties")
>>> jsonpath_expr.find(data)[0].value['test'] = 2
>>> print(data)
{'dogs': [{'tail': True, 'properties': {'test': 2}}]}
请注意,您在显示的代码中仍有 "by reference" 行为:
>>> data = {"dogs":[{"tail": True, "properties":{"test":1}}]}
>>>
>>> path = ["dogs", 0, "properties"]
>>> mydata = data
>>> for i in path:
... mydata = mydata[i]
...
>>> mydata["test"] = 2
>>> print(data)
{'dogs': [{'tail': True, 'properties': {'test': 2}}]}