我有一个来自API请求的字典,看起来像这样:
{
"key 1": "value 1",
"key 2": "value 2",
"key 3":
{
"key 4": "value 4",
"key 5": "value 5",
"key 6": "value 6"
},
... # Additional fields here
}
我需要将一些值保存到另一本字典中,例如{"key 2": "value 2","key 5":"value 5"}
。为了使代码看起来更好,我想将值的索引保存在["key 2", "key 3/key 5"]
之类的列表中。
但是我无法轻松地用"key 3/key 5"
为字典建立索引,并且想知道是否有办法做到这一点。
例如:
dict={"username":"user",
"email":"user@domain.com",
"properties":{
"favorite color":"blue"
"favorite food":"apples"
}
}
savevalues=["email","properties/favorite food"]
将会返回
{"email":"user@domain.com","favorite food":"apples"}
答案 0 :(得分:1)
由于您一直在谈论使用列表,因此可以使用嵌套列表/元组来引用字典中词典中的索引。
d = {
"key 1": "value 1",
"key 2": "value 2",
"key 3":
{
"key 4": "value 4",
"key 5": "value 5",
"key 6": "value 6"
}
}
key_sets = (("key 2",), ("key 3", "key 5"))
for key_set in key_sets:
value = d
for key in key_set:
value = value[key]
print(value)
# value 2
# value 5
from functools import reduce
# `reduce` using key_sets above, a tuple or list of tuples or lists
print(tuple(
reduce(
dict.get,
key_set,
d
) for key_set in key_sets
))
# ('value 2', 'value 5')
keys = ("key 2", "key 3/key 5")
# `reduce` using '/'-separated nested keys, per the example in the question
print(tuple(
reduce(
dict.get,
key.split("/"),
d
) for key in keys
))
# ('value 2', 'value 5')
这假设您的密钥集始终有效。如果这不是您可以做的假设,则需要进行一些异常处理。
已编辑以添加功能示例。
答案 1 :(得分:0)
pandas
是您的图书馆新朋友,尤其是io.json.nested_to_record
函数(哈哈):
from pandas.io import json
flat = json.nested_to_record(d)
savevalues=["email","properties/favorite food"]
print({i.split('/')[-1]:flat[i.replace('/','.')] for i in savevalues})
整个演示:
d={"username":"user",
"email":"user@domain.com",
"properties":{
"favorite color":"blue",
"favorite food":"apples"
}
}
from pandas.io import json
flat = json.nested_to_record(d)
savevalues=["email","properties/favorite food"]
print({i.split('/')[-1]:flat[i.replace('/','.')] for i in savevalues})
输出:
{'email': 'user@domain.com', 'favorite food': 'apples'}
我建议这样做是为了提高速度,它非常快,特别是比循环要快:-),pandas
始终是数据方面最快的东西……,请查看文档并成为专家……” >