Python字典列表取值匹配异常:条件判断未触发求助
问题分析与解决
问题描述
有一个字典列表,需求是遍历所有元素的message值:当该值包含"App init"时执行sys.exit(0),包含"Error"时执行sys.exit(1)。但实际运行时,log[index]['message'] in 'App init'条件未触发,无法输出预期的打印内容。
核心错误点
in运算符逻辑颠倒:
原代码中log[index]['message'] in 'App init'的含义是「判断整个message字符串是否是"App init"的子串」,但实际需求是「判断"App init"是否存在于message字符串中」,正确写法应该是'App init' in log[index]['message']。- 未导入
sys模块:
代码中使用了sys.exit()但没有提前导入sys模块,运行时会抛出NameError。 - 大小写与逻辑双重错误:
第二个条件log[index]['message'] in 'ERROR'同样逻辑颠倒,且需求是匹配"Error"(注意大小写),正确写法应为'Error' in log[index]['message'](若需忽略大小写可转为小写判断)。 - 循环写法冗余:
使用for index in range(len(log))遍历列表不够简洁,直接遍历列表中的字典元素更符合Python风格。
修正后的代码
import sys log = [ {'timestamp': 1666791137689, 'level': 'ALL', 'message': '10-26 14:54:33.389 7768 7793 D EGL_emulation: app_time_stats: avg=16.67ms min=15.85ms max=17.49ms count=60'}, {'timestamp': 1666791137689, 'level': 'ALL', 'message': '10-26 14:54:34.390 7768 7793 D EGL_emulation: app_time_stats: avg=15.44ms min=14.40ms max=16.90ms count=60'}, {'timestamp': 1666791137689, 'level': 'ALL', 'message': '10-26 14:54:35.406 7768 7793 D EGL_emulation: app_time_stats: avg=15.54ms min=11.85ms max=17.15ms count=61'}, {'timestamp': 1666791137689, 'level': 'ALL', 'message': '10-26 14:54:35.654 218 7685 I keystore2: keystore2::watchdog: Watchdog thread idle -> terminating. Have a great day.'}, {'timestamp': 1666791137689, 'level': 'ALL', 'message': '10-29 05:04:01.873 Default [Info ] App init'} ] message_list = [] for item in log: msg = item['message'] message_list.append(msg) print(msg) if 'App init' in msg: print(f"haha The application is running: {msg}") sys.exit(0) elif 'Error' in msg: print(f"haha The application is having ERROR: {msg}") sys.exit(1) with open('message_log.txt', 'w') as f: f.write(str(message_list))
额外优化建议
- 使用f-string拼接字符串比
+更直观易读; - 如果需要忽略大小写匹配,可将判断条件改为
'app init' in msg.lower()和'error' in msg.lower(); - 若message内容可能不存在,建议添加
item.get('message', '')避免KeyError。
内容的提问来源于stack exchange,提问作者bbq123
相关产品推荐
相关产品推荐

