You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化字典推导式?合并与还原字典的优化实现问询

解决方案

没问题,这两个需求都能轻松实现,而且能保证逻辑和原来完全一致,同时兼顾代码简洁性与运行效率。咱们一步步来调整:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:17:41