Python实现电影评分文件转字典:解决同名电影仅保留最后一条评分的问题
解决Python字典仅保留最后一条电影评分的问题
我一眼就看出问题所在啦——你每次循环都直接用新的评分覆盖了字典里对应电影的旧值,自然最后只能留下每部电影的最后一条评分!咱们来一步步修复这个问题:
问题根源分析
你的代码里这一行是关键问题:
input[movie] = rating
每次遇到同一个电影名称时,都会把之前存储的值(不管是单个评分还是列表)替换成当前的rating字符串,所以最后只会保留最后一次循环的评分。
修复方案
我们需要让字典的每个键(电影名称)对应一个列表,每次读取到该电影的评分时,就把评分追加到列表里,而不是覆盖。同时建议做两个优化:
- 用
with语句打开文件,自动管理文件资源,避免忘记关闭文件 - 把评分从字符串转换成浮点数,方便后续的数值计算
修改后的代码如下:
def read_ratings_data(f): ratings_dict = {} # 使用with语句安全打开文件 with open(f, 'r') as file: for line in file: # 去除行尾的换行符后再分割 movie, rating_str, num_id = line.strip().split('|') # 把评分转换成浮点数 rating = float(rating_str) # 判断电影是否已在字典中 if movie not in ratings_dict: # 若不存在,创建一个新列表存储评分 ratings_dict[movie] = [] # 将当前评分追加到列表中 ratings_dict[movie].append(rating) return ratings_dict # 测试调用(假设你的文件名为ratings.txt) result = read_ratings_data("ratings.txt") print(result)
更简洁的写法(可选)
可以用字典的setdefault方法简化判断逻辑,一行代码完成“不存在则创建空列表,存在则获取已有列表”的操作:
def read_ratings_data(f): ratings_dict = {} with open(f, 'r') as file: for line in file: movie, rating_str, num_id = line.strip().split('|') rating = float(rating_str) # setdefault会自动处理不存在的键,返回对应的列表 ratings_dict.setdefault(movie, []).append(rating) return ratings_dict
测试结果
用你提供的样本数据运行后,输出会是:
{'Toy Story (1995)': [4.0, 4.0, 4.5, 2.5, 4.5, 3.5], 'Jumanji (1995)': [4.0, 4.0, 3.0, 3.0, 3.0, 3.5]}
完美符合你想要的“存储所有同名电影评分”的需求~
内容的提问来源于stack exchange,提问作者aflsjd
相关产品推荐
相关产品推荐

