You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:53:13