如何基于CSV文件生成键为院系、值为对应数量的字典
问题原因
你的原有代码存在以下逻辑错误:
- 提前硬编码院系列表既容易出现拼写错误(比如你写的
buiseness、大小写不匹配的smart IOT),也无法适配CSV中实际出现的院系值 - 内层遍历逻辑错误:每读取一行CSV,就给所有预设院系的列表追加一次当前行的院系值,完全没有做匹配判断
- 最终赋值逻辑错误:直接将所有院系的统计值设为了预设列表的总长度,和实际出现次数完全无关
正确实现
方案1:统计所有出现过的院系(最常用,无需提前预设列表)
使用Python标准库collections.Counter可以非常便捷地完成统计:
import csv from collections import Counter with open('fake_student_records.csv', mode='r', encoding='utf-8') as csv_file: csv_reader = csv.DictReader(csv_file) # 直接提取所有行的department字段交给Counter统计 dept_count = Counter(row['department'].strip() for row in csv_reader) # 转成普通字典(如果需要的话,Counter本身也是字典子类) print(dict(dept_count))
如果需要忽略大小写、统一输出格式(比如全小写/首字母大写),可以修改提取逻辑:
# 比如统一转全小写统计 dept_count = Counter(row['department'].strip().lower() for row in csv_reader)
方案2:仅统计你预设的names列表中的院系
如果确实需要限定统计范围为你提前定义的院系,可以用如下逻辑:
import csv names = ['japanese', 'psychology', 'economics', 'business', 'biology', 'medical', 'software', 'smart iot', 'big data', 'electronics', 'contents IT'] # 初始化统计字典 dept_count = {name: 0 for name in names} with open('fake_student_records.csv', mode='r', encoding='utf-8') as csv_file: csv_reader = csv.DictReader(csv_file) for row in csv_reader: current_dept = row['department'].strip().lower() # 匹配到预设列表中的院系再计数+1 if current_dept in dept_count: dept_count[current_dept] += 1 print(dept_count)
内容的提问来源于stack exchange,提问作者user17143278
相关产品推荐
相关产品推荐

