如何修复该字典相关Python代码以实现指定CSV处理功能?
代码修复方案
问题分析
你的代码存在几个关键问题,导致无法正常实现需求:
- 字典结构设计错误:当前字典仅统计了人名出现次数,但丢失了歌曲名、歌手等关联信息,无法满足输出要求。
- CSV写入字段不匹配:输出表头是
["song", "artist", "year"],但写入的是{人名: 次数},字段完全不对应,会导致输出内容为空或错误。 - 冗余的文件关闭操作:
with语句会自动管理文件资源,手动调用close()不仅多余,还会引发已关闭文件的操作错误。 - 未匹配需求的输出字段:需求要求输出人名数量、歌曲名和歌手,但当前表头未包含人名和计数字段。
修复后的代码
import csv from collections import defaultdict def findName(thresh, outputFile): # 构建嵌套字典,同时存储人名的出现次数和对应的歌曲、歌手信息 # 结构: {人名: {"count": 次数, "entries": [{"song": 歌名, "artist": 歌手}, ...]}} name_data = defaultdict(lambda: {"count": 0, "entries": []}) with open('allNames.csv', newline='') as csvfile: # 假设输入CSV包含name、song、artist字段(可根据实际文件调整) reader = csv.DictReader(csvfile, delimiter="\t") for row in reader: name = row["name"] name_data[name]["count"] += 1 # 存储当前行的歌曲和歌手信息 name_data[name]["entries"].append({ "song": row["song"], "artist": row["artist"] }) with open(outputFile, "w", newline='') as outfile: # 调整表头以匹配需求:人名、出现次数、歌曲名、歌手 headers = ["name", "count", "song", "artist"] writer = csv.DictWriter(outfile, fieldnames=headers) writer.writeheader() # 筛选符合阈值的人名,写入对应的关联信息 for name, data in name_data.items(): if data["count"] >= thresh: # 为该人名的每一条歌曲/歌手关联记录写入一行 for entry in data["entries"]: writer.writerow({ "name": name, "count": data["count"], "song": entry["song"], "artist": entry["artist"] }) # 示例调用(按需取消注释) # findName(3, "output.csv")
关键修复点说明
- 字典结构优化:使用
collections.defaultdict构建嵌套字典,同时存储人名的出现次数和对应的歌曲、歌手列表,避免丢失关联信息。 - 输出字段匹配:调整表头为
["name", "count", "song", "artist"],确保写入内容和表头一一对应。 - 移除冗余操作:删除手动关闭文件的代码,依赖
with语句自动管理文件资源。 - 逻辑补全:遍历符合阈值的人名,将其对应的每一条歌曲/歌手关联记录写入输出文件,满足需求中同时展示人名数量、歌曲名和歌手的要求。
内容的提问来源于stack exchange,提问作者butterflyuno
相关产品推荐
相关产品推荐

