修改嵌套字典中的元素,并为其指定“路径”

给定索引列表的“路径”(任意长度)和嵌套的Python列表/字典对象,如何在列表中写入对象的一部分?

例如,这可能是我的对象(它是从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}}]}

请注意,在显示的代码中您仍然具有“按引用”行为:

>>> 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}}]}
上一篇:python-Django嵌套内联TemplateDoesNotExist


下一篇:maxent:最大熵模型的java实现,GIS训练