如何遍历Python类对象列表并统计相同属性值的数量?
优化Python问卷提交数据中民族统计的实现方式
你当前的实现确实存在可优化空间——硬编码多个变量和分支判断的写法不仅冗余,后续新增民族选项时还需要修改多处代码。下面提供几种更简洁高效的实现方案:
方案一:使用普通字典统计
用字典存储各民族计数,无需提前定义大量变量,逻辑更灵活:
ethnicity_counts = {"White": 0, "Black": 0, "Asian": 0, "Mixed": 0, "Other": 0} total_submissions = 0 for s in submissions: submissionList.insert(END, s.getInfo()) total_submissions += 1 if s.ethnicity in ethnicity_counts: ethnicity_counts[s.ethnicity] += 1
后续查看各民族人数时,直接通过ethnicity_counts["White"]这类方式获取即可;新增民族选项只需要修改初始字典的键,无需改动循环内的逻辑。
方案二:使用collections.Counter(推荐)
Python标准库的collections.Counter专门用于计数场景,代码会更简洁:
from collections import Counter ethnicity_counts = Counter() total_submissions = 0 for s in submissions: submissionList.insert(END, s.getInfo()) total_submissions += 1 ethnicity_counts[s.ethnicity] += 1
Counter会自动处理不存在的键,首次遇到时会默认初始化为0再累加。你还可以通过ethnicity_counts.most_common()直接获取按数量排序的统计结果,非常实用。
如果需要限定只统计指定民族(避免无效值干扰),可以提前初始化Counter的默认键:
ethnicity_counts = Counter({"White": 0, "Black": 0, "Asian": 0, "Mixed": 0, "Other": 0})
方案三:结合生成器表达式简化统计
如果不需要在循环中同时处理submissionList插入操作,还可以将插入和统计分离,逻辑更清晰:
from collections import Counter # 先完成所有提交内容的插入 for s in submissions: submissionList.insert(END, s.getInfo()) total_submissions = len(submissions) ethnicity_counts = Counter(s.ethnicity for s in submissions)
这些方案都比你原实现更简洁、可维护性更高,后续调整民族选项时,无需修改循环内的判断逻辑,仅需调整统计的初始配置即可。
内容的提问来源于stack exchange,提问作者Whendry123
相关产品推荐
相关产品推荐

