首页 > 解决方案 > 如何访问具有特定格式的字典的所有键值

问题描述

我有一本字典。我想像 python 如何从字典中获取值一样显示字典。为澄清起见,示例如下:

example = {"a": 1, "b": "2", "c": 3, "d": {"x": "b", "y": "p", "q": {"w": 1, "z": "2"}}}
value_dict = {}

def recursive_items(dictionary):
    for key in dictionary:
        sub_data = dictionary[key]
        if isinstance(sub_data, dict):
            new_dict = {}
            for sub_key in sub_data:
                # new_dict[f"{key}.{sub_key}"]=sub_data[sub_key]
                new_dict[f"{key}.{sub_key}"] = f"data.get('{key}').get('{sub_key}')"
                recursive_items(new_dict)
        else:
            value_dict[key]=dictionary[key]
    return value_dict

items=recursive_items(example)
print(items)

当前输出为:

{'a': 1, 'b': '2', 'c': 3, 'd.x': "data.get('d').get('x')", 'd.y': "data.get('d').get('y')", 'd.q': "data.get('d').get('q')"}

但我想要如下输出:

{'a': "data.get('a')", 'b': "data.get('b')", 'c': "data.get('c')", 'd.x': "data.get('d').get('x')", 'd.y': "data.get('d').get('y')", 'd.q.w': "data.get('d').get('q').get('w'),'d.q.z': "data.get('d').get('q').get('z')"}

标签: python-3.x

解决方案


您没有递归字典,此外,在 else 部分您没有设置键的路径,例如:

value_dict[key]= f"data.get('{key}')"

实际上,在这类问题中,我建议你把问题分成几个部分,然后去克服它们。例如,在这个问题中,有两种情况

  1. sub_data 是字典的一种情况
  2. sub_data 是另一种类型的一种情况因此,一种可能的解决方案是递归字典,直到达到非字典类型值,然后在新字典中写入路径和所需的字符串,例如:
    value_dict[key_str]= path_str

其中 key_str 是该键的路径,而 path_str 是 f"data.get()" 等格式的值。我为此配置了以下解决方案。您可以自己修改或优化代码。

example = {"a": 1, "b": "2", "c": 3, "d": {"x": "b", "y": "p", "q": {"w": 1, "z": "2"}}}
value_dict = {}
def recursive_items(dictionary,path=None):
    for key in dictionary:
        sub_data = dictionary[key]
        if isinstance(sub_data, dict):
            if path is None:
                recursive_items(sub_data,f"{key}")
            else:
                recursive_items(sub_data,f"{path}.{key}")
        else:
            path_str = "data"
            key_str = key
            if not path is None:
                key_str = f"{path}.{key}"
                path_keys = path.split('.')
                for p_key in path_keys:
                    path_str = f"{path_str}.get('{p_key}')"
            path_str = f"{path_str}.get('{key}')"
            value_dict[key_str]= path_str
    return value_dict

items=recursive_items(example)
print(items)

这段代码的输出是

{'a': "data.get('a')", 'b': "data.get('b')", 'c': "data.get('c')", 'dx': "data.get('d').get('x')", 'dy': "data.get('d').get('y')", 'dqw': "data.get(' d').get('q').get('w')", 'dqz': "data.get('d').get('q').get('z')"}


推荐阅读