索引嵌套字典中的值

时间:2018-11-06 01:36:05

标签: python python-3.x

我有一个来自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"}

2 个答案:

答案 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始终是数据方面最快的东西……,请查看文档并成为专家……” >