Python如何用嵌套列表推导式分类direct_queried类型报错
列表推导式实现报错分类方案
核心规则:仅统计type为direct_queried的报错记录,indirect_queried类型记录直接排除,按报错关键词对目标名称列表做四分类。
直接可用的列表推导式代码
补全后的代码如下,全部为单行推导逻辑,符合要求:
success = [name for name in names if not any(e['name'] == name and e['type'] == 'direct_queried' for e in errors)] unauthorized = [name for name in names if any(e['name'] == name and e['type'] == 'direct_queried' and 'denied' in e['error'] for e in errors)] not_found = [name for name in names if any(e['name'] == name and e['type'] == 'direct_queried' and 'not found' in e['error'] for e in errors)] unknown = [name for name in names if any(e['name'] == name and e['type'] == 'direct_queried' and 'denied' not in e['error'] and 'not found' not in e['error'] for e in errors)]
代码中使用any()做匹配判断,只要errors中存在符合条件的记录就会命中分类,逻辑完全匹配设定的分类规则。
测试结果说明
基于给出的测试数据运行上述代码,结果如下:
success = ['name-2']:name-2对应的报错为indirect_queried类型,无有效直接查询报错,归入成功分类unauthorized = []:给定的待统计names列表为['name-1','name-2','name-3'],其中没有名称匹配含denied的直接查询报错;示例中提到的name-4不在目标名称列表内,默认不会被统计not_found = ['name-3']:name-3的直接查询报错包含not found关键词,符合分类规则unknown = ['name-1']:name-1的直接查询报错为unknown error,不含denied和not found关键词,符合分类规则
如果你需要统计所有直接查询报错的名称(包含不在给定names列表里的name-4),只需要把四个推导式里遍历的迭代对象从
names替换为去重后的直接查询名称集合{e['name'] for e in errors if e['type'] == 'direct_queried'}即可,调整后unauthorized的输出为['name-4'],和给出的预期示例完全一致。
性能优化方案(可选)
当errors列表数据量较大时,每次分类都全量遍历errors做any()判断会产生重复计算,推荐先预生成直接查询报错的名称-错误信息映射字典,仅需遍历一次errors,后续分类直接查字典即可,执行效率更高:
# 预生成映射,仅遍历一次errors direct_err_map = {e['name']: e['error'] for e in errors if e['type'] == 'direct_queried'} # 分类逻辑直接查字典,无重复遍历 success = [name for name in names if name not in direct_err_map] unauthorized = [name for name in names if name in direct_err_map and 'denied' in direct_err_map[name]] not_found = [name for name in names if name in direct_err_map and 'not found' in direct_err_map[name]] unknown = [name for name in names if name in direct_err_map and 'denied' not in direct_err_map[name] and 'not found' not in direct_err_map[name]]
内容的提问来源于stack exchange,提问作者Naxi
相关产品推荐
相关产品推荐

