Pythonic方式实现嵌套字典键值互换及嵌套键重命名方案问询
一行字典推导式实现嵌套字典的键值互换与键重命名
没问题,这事儿用一行字典推导式完全能搞定,而且不用itertools这类工具,纯Python基础语法就够。先给你举个贴合需求的示例,再拆解推导式的逻辑:
示例场景
假设你的原始嵌套字典是这样的:
original_dict = { "fruit": {"name": "apple", "color": "red"}, "vegetable": {"name": "carrot", "color": "orange"}, "grain": {"name": "rice", "color": "white"} }
你想要的目标结构是:把内层字典的name值作为新的外层键,同时把原来的外层键(比如fruit)重命名为category,保留其他嵌套键,最终得到:
target_dict = { "apple": {"category": "fruit", "color": "red"}, "carrot": {"category": "vegetable", "color": "orange"}, "rice": {"category": "grain", "color": "white"} }
一行实现的推导式
target_dict = {v["name"]: {"category": k, **v} for k, v in original_dict.items()}
逻辑拆解
这个推导式完全基于基础的字典推导和字典解包语法,每一部分的作用清晰明了:
- 外层遍历:
for k, v in original_dict.items()—— 拿到原始字典的外层键k(比如"fruit")和对应的内层字典v - 新外层键:
v["name"]—— 用内层字典里的name值作为新字典的外层键 - 新内层字典:
{"category": k, **v}——- 先添加重命名后的键值对:
"category": k,把原来的外层键转成内层的category键 - 用
**v解包原始内层字典的所有键值对,自动保留其他嵌套键(比如color)
- 先添加重命名后的键值对:
特殊情况处理
如果你的原始内层字典里恰好存在category键(会被覆盖),或者你想移除原来的name键,可以稍微调整推导式,过滤掉name键:
target_dict = { v["name"]: {"category": k, **{key: val for key, val in v.items() if key != "name"}} for k, v in original_dict.items() }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

