如何以更Pythonic的方式修改嵌套字典列表结构中的指定值?
问题描述
给定如下Python字典结构:
pd = { "RP": [ { "Name": "PD", "Value": "qwe" }, { "Name": "qwe", "Value": "change" } ], "RFN": [ "All" ], "RIT": [ { "ID": "All", "IDT": "All" } ] }
需要将字典内列表中子字典里值为"change"的元素修改为"changed"。当前使用的实现方式如下,但因多次遍历数据,认为效率较低,询问是否有更高效、更符合Python风格的实现方式:
for key, value in pd.items(): ls = pd[key] for d in ls: if type(d) == dict: for k,v in d.items(): if v == 'change': pd[key][ls.index(d)][k] = "changed"
优化方案
你的代码有几个可以改进的地方,优化后不仅效率更高,也更符合Python的写法习惯:
- 不需要用
pd[key][ls.index(d)]定位字典,遍历到子字典时直接修改它就行,ls.index(d)会额外遍历列表找索引,属于不必要的性能浪费 - 判断类型用
isinstance(item, dict)比type(d) == dict更合理,能兼容字典子类的情况 - 直接遍历字典的值,不用多余的键变量
优化后的通用版代码:
for lst in pd.values(): for item in lst: if isinstance(item, dict): for k, v in item.items(): if v == "change": item[k] = "changed"
如果明确知道要修改的是RP列表里子字典的Value键,可以直接精准定位,进一步减少遍历范围:
for item in pd["RP"]: if isinstance(item, dict) and item.get("Value") == "change": item["Value"] = "changed"
这个版本效率更高的原因:
- 省去了查找列表索引的额外遍历开销
- 精准定位目标数据时,不用遍历所有键值对,直接判断指定键的值
- 代码更简洁易读,符合Python的“直白胜于晦涩”原则
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

