如何用简洁高效的Python代码统计字典列表各键的非X元素次数并校验?
高效统计问卷有效回答数的Python实现
问题背景
给定一个字典列表,每个字典的键代表问题编码,对应的值为1-7的评分或表示未作答的"X"。示例数据如下:
responses = [ {"a":1,"b":2,"c":"X"}, {"a":1,"b":"X","c":3}, {"a":1,"b":2,"c":"X"} ]
需要完成两个目标:
- 统计每个问题的有效回答数(即值不等于"X"的次数)
- 检查是否存在有效数小于5或大于50的问题
要求代码简洁高效,需重复执行数千次,对性能有一定要求。
解决方案
纯Python高效实现(轻量场景首选)
使用collections.defaultdict减少键存在性判断,结合嵌套循环完成统计,内置方法的迭代效率远高于手动多层循环:
from collections import defaultdict def count_valid_responses(responses): valid_counts = defaultdict(int) # 遍历所有回答,累计有效次数 for resp in responses: for question, answer in resp.items(): if answer != "X": valid_counts[question] += 1 # 筛选不符合数量要求的问题 invalid_questions = [q for q, cnt in valid_counts.items() if cnt < 5 or cnt > 50] return valid_counts, invalid_questions # 调用示例 counts, invalid = count_valid_responses(responses) print("有效回答统计:", counts) # 输出: {'a': 3, 'b': 2, 'c': 1} print("异常问题列表:", invalid) # 输出: ['a', 'b', 'c']
Pandas向量化实现(大规模数据首选)
如果处理的数据集规模较大,Pandas的向量化操作能大幅提升性能,避免Python级别的循环开销:
import pandas as pd def count_valid_with_pandas(responses): # 转换为DataFrame df = pd.DataFrame(responses) # 统计每列(问题)非"X"的数量 valid_counts = df.ne("X").sum(axis=0).to_dict() # 筛选异常问题 invalid_questions = [q for q, cnt in valid_counts.items() if cnt < 5 or cnt > 50] return valid_counts, invalid_questions # 调用示例 counts_pd, invalid_pd = count_valid_with_pandas(responses) print("Pandas统计结果:", counts_pd) print("异常问题列表:", invalid_pd)
性能说明
- 小规模数据(单列表含数百个字典):纯Python方法足够高效,启动开销小
- 大规模数据(单列表含数千/上万个字典):Pandas的向量化操作性能优势明显,适合重复执行数千次的场景
内容的提问来源于stack exchange,提问作者Introser
相关产品推荐
相关产品推荐

