如何简化字典推导式?合并与还原字典的优化实现问询
解决方案
没问题,这两个需求都能轻松实现,而且能保证逻辑和原来完全一致,同时兼顾代码简洁性与运行效率。咱们一步步来调整:
1. 合并两组字典推导式为一个
原来的代码通过两个推导式生成临时字典再用update合并,其实可以直接在一个字典推导式里用条件表达式处理两种场景(key在allKeys内/不在),既省了临时字典的内存开销,代码也更紧凑:
dicTfAll={1:{'c1': ['aa','bb','cc']}, 2:{'c1': ['dd','ee','ff']}} dicTf={1:{'c2': ['aax','bbx','cc']}, 2:{'c2': ['ddy','eey','ff']}, 3: {'c2': ['xx', '11']}} allKeys = list(dicTfAll.keys()) # 合并后的单字典推导式 dicTfAllP = { k: dicTfAll[k] | v if k in allKeys else v for k, v in dicTf.items() }
补充说明:
- 这里用了Python 3.9+支持的字典合并运算符
|,比原来的dict(dicTfAll[item[0]],**item[1])更高效、可读性更强;如果你的Python版本低于3.9,替换成dict(dicTfAll[k], **v)即可兼容。 - 推导式逻辑和原代码完全等价:key不在
allKeys时直接取dicTf的value;key在allKeys时合并dicTfAll与dicTf对应key的字典。
2. 将循环代码改写为字典推导式
原来生成outputCompanies的嵌套循环可以直接转成嵌套字典推导式,逻辑丝毫不差,代码更简洁:
listOfCompanies=['c1','c2'] # 改写后的字典推导式 outputCompanies = { company: {token: key for key in allKeys if company in dicTfAllP[key] for token in dicTfAllP[key][company]} for company in listOfCompanies }
补充说明:
- 外层推导式遍历
listOfCompanies的每个company作为顶级键; - 内层推导式先筛选出包含当前company的key,再遍历该key下company对应的token列表,生成
token: key的映射,和原循环的执行逻辑完全匹配。
效率优化小提示
如果你的字典key数量较多,建议把allKeys改成集合:
allKeys_set = set(dicTfAll.keys())
因为列表的in操作是O(n)时间复杂度,而集合的in是O(1),能大幅提升第一个推导式里k in allKeys的判断速度。
内容的提问来源于stack exchange,提问作者DanielTheRocketMan
相关产品推荐
相关产品推荐

