如何根据键值获取字典列表中的字典?并优化邮件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)
优化思路说明
- 分组处理:用
defaultdict将所有payload按邮箱归类,避免每次查询都遍历整个大列表。后续新增步骤时,只需将结果加入合并列表即可,逻辑扩展性更强。 - 明确逻辑分支:将“找第一个error”和“取最后一个success”拆分为独立逻辑,代码可读性大幅提升,后续需求变更(比如改为取最后一个error)也更容易修改。
- 消除嵌套循环:原代码中
get_status函数需要遍历全量payload找对应邮箱,分组后直接拿到目标邮箱的所有payload,减少了不必要的遍历操作。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

