从递归嵌套的字段列表创建部分字典
Create partial dict from recursively nested field list
在 之后用于部分响应,例如?fields=name,id,another(name,id),date
,我得到了一个任意嵌套的字符串列表,表示嵌套 JSON 对象的各个键:
['name', 'id', ['another', ['name', 'id']], 'date']
目标是将已解析的 'graph' 键映射到原始的、更大的字典上,并只检索它的部分副本,例如:
input_dict = {
"name": "foobar",
"id": "1",
"another": {
"name": "spam",
"id": "42",
"but_wait": "there is more!"
},
"even_more": {
"nesting": {
"why": "not?"
}
},
"date": 1584567297
}
应该简单地:
output_dict = {
"name": "foobar",
"id": "1",
"another": {
"name": "spam",
"id": "42"
},
"date": 1584567297,
}
到目前为止,我已经浏览了 nested defaultdicts, addict and glom,但是它们作为输入的映射与我的列表不兼容(当然可能遗漏了一些东西),我最终得到了垃圾。
我如何以编程方式执行此操作,并考虑可能发生的任何嵌套?
您可以使用:
def rec(d, f):
result = {}
for i in f:
if isinstance(i, list):
result[i[0]] = rec(d[i[0]], i[1])
else:
result[i] = d[i]
return result
f = ['name', 'id', ['another', ['name', 'id']], 'date']
rec(input_dict, f)
输出:
{'name': 'foobar',
'id': '1',
'another': {'name': 'spam', 'id': '42'},
'date': 1584567297}
此处假设在嵌套列表中,第一个元素是来自上层的有效键,第二个元素包含来自嵌套字典的有效键,这是第一个元素的值
在 ?fields=name,id,another(name,id),date
,我得到了一个任意嵌套的字符串列表,表示嵌套 JSON 对象的各个键:
['name', 'id', ['another', ['name', 'id']], 'date']
目标是将已解析的 'graph' 键映射到原始的、更大的字典上,并只检索它的部分副本,例如:
input_dict = {
"name": "foobar",
"id": "1",
"another": {
"name": "spam",
"id": "42",
"but_wait": "there is more!"
},
"even_more": {
"nesting": {
"why": "not?"
}
},
"date": 1584567297
}
应该简单地:
output_dict = {
"name": "foobar",
"id": "1",
"another": {
"name": "spam",
"id": "42"
},
"date": 1584567297,
}
到目前为止,我已经浏览了 nested defaultdicts, addict and glom,但是它们作为输入的映射与我的列表不兼容(当然可能遗漏了一些东西),我最终得到了垃圾。
我如何以编程方式执行此操作,并考虑可能发生的任何嵌套?
您可以使用:
def rec(d, f):
result = {}
for i in f:
if isinstance(i, list):
result[i[0]] = rec(d[i[0]], i[1])
else:
result[i] = d[i]
return result
f = ['name', 'id', ['another', ['name', 'id']], 'date']
rec(input_dict, f)
输出:
{'name': 'foobar',
'id': '1',
'another': {'name': 'spam', 'id': '42'},
'date': 1584567297}
此处假设在嵌套列表中,第一个元素是来自上层的有效键,第二个元素包含来自嵌套字典的有效键,这是第一个元素的值