python-3.x - 如何访问具有特定格式的字典的所有键值
问题描述
我有一本字典。我想像 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')"}
解决方案
您没有递归字典,此外,在 else 部分您没有设置键的路径,例如:
value_dict[key]= f"data.get('{key}')"
实际上,在这类问题中,我建议你把问题分成几个部分,然后去克服它们。例如,在这个问题中,有两种情况
- sub_data 是字典的一种情况
- 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')"}
推荐阅读
- javascript - 在 RXJS 中创建自定义 pipable 运算符
- python - TensorFlow 内存堆栈管理
- python - 以最少的行和列打印列表
- tree - 当我们在树上找到多个目标中的一个时,我们会停下来吗?
- python - 在pyqt5中按下按钮有时间限制吗?
- ios - ios画外音滑块双击并按住,但用于自定义视图
- java - 检查查询结果是否已更改,以免重新查询所有内容?
- javascript - 在添加侦听器的函数中声明/包含的函数中删除事件侦听器
- javascript - 我应该为 Building library 选择哪个?ES5 或 ES6
- phpxlsxwriter - phpxlsxwriter 在一个单元格上插入多种字体样式