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

如何根据键值获取字典列表中的字典?并优化邮件Payload处理代码

问题解答

问题1:根据键值从字典列表中获取对应的字典

这里提供几种实用的实现方式:

  • 基础循环查找:遍历列表,匹配目标键值后返回,适合简单场景

    def get_dict_by_key(dict_list, key, value):
        for item in dict_list:
            if item.get(key) == value:
                return item
        return None  # 未找到时返回None
    
  • 用next()函数简化写法:结合生成器表达式,代码更简洁

    target_dict = next((item for item in dict_list if item["email"] == "test1@gmail.com"), None)
    
  • 预构建映射字典(适合多次查询):如果需要频繁基于该键查询,先将列表转换为以目标键为key的字典,后续查询效率为O(1)

    email_to_dict = {item["email"]: item for item in dict_list}
    target_dict = email_to_dict.get("test1@gmail.com")
    

问题2:优化邮箱状态payload的获取逻辑

原代码使用嵌套循环,维护成本高。可以通过按邮箱分组所有payload的方式重构,让逻辑更清晰、可维护性更强:

优化后的实现代码

def main(emails):
    result_from_step_1 = [
        {"email": "test1@gmail.com", "status": "success", "step": 1},
        {"email": "test2@gmail.com", "status": "error", "step": 1},
    ]
    result_from_step_2 = [
        {"email": "test1@gmail.com", "status": "error", "step": 2},
        {"email": "test2@gmail.com", "status": "success", "step": 2},
    ]
    result_from_step_3 = [
        {"email": "test1@gmail.com", "status": "error", "step": 3},
        {"email": "test2@gmail.com", "status": "success", "step": 3},
    ]

    # 按邮箱分组所有payload,保留步骤执行顺序
    from collections import defaultdict
    email_payloads = defaultdict(list)
    all_payloads = result_from_step_1 + result_from_step_2 + result_from_step_3
    for payload in all_payloads:
        email_payloads[payload["email"]].append(payload)

    # 处理每个邮箱的payload列表
    response = []
    for email in emails:
        payload_list = email_payloads.get(email, [])
        if not payload_list:
            response.append(None)
            continue
        
        # 查找第一个error状态的payload
        first_error = next((p for p in payload_list if p["status"] == "error"), None)
        if first_error:
            response.append(first_error)
        else:
            # 所有状态都是success,取最后一个
            response.append(payload_list[-1])
    
    return response

emails = ["test1@gmail.com", "test2@gmail.com"]
response = main(emails)
print(response)

优化思路说明

  1. 分组处理:用defaultdict将所有payload按邮箱归类,避免每次查询都遍历整个大列表。后续新增步骤时,只需将结果加入合并列表即可,逻辑扩展性更强。
  2. 明确逻辑分支:将“找第一个error”和“取最后一个success”拆分为独立逻辑,代码可读性大幅提升,后续需求变更(比如改为取最后一个error)也更容易修改。
  3. 消除嵌套循环:原代码中get_status函数需要遍历全量payload找对应邮箱,分组后直接拿到目标邮箱的所有payload,减少了不必要的遍历操作。

内容的提问来源于stack exchange,提问作者Luiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:20:10