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

Python按首字母筛选电影时if语句失效返回全部数据问题

问题描述

编写的if判断语句未按预期生效,具体场景为:从txt文件读取电影名称与上映日期,转换为字典结构后实现两个功能:

  • 接收用户输入的年份,将对应年份上映的电影存入列表,该功能运行正常
  • 接收用户输入的字母,将名称以该字母开头的电影及对应上映日期存入列表,该功能的if判断未生效,会将所有电影加入列表。例如输入字母"u"时,预期仅返回U开头的电影列表:

[1996 Unhook the Stars, 2005,Up and Down,1996,Unhook the Stars, 1987,Unsolved Mysteries: Psychics, 2004,Unconstitutional: The War on Our Civil Liberties]

出错代码
movies = {}
years = []
names = []
def load_movies():
    with open("movie_data.txt", "r") as document:
        for line in document:
            (k, v) = line.split(",")
            movies.update({k : (movies[k] if k in movies else []) + [v]})
def get_movies_by_year():
    x = str(input("Enter a year: "))
    for i , t in movies.items():
        if x == i :
            years.insert(1, (t))
    #print_list(years)
def get_movies_by_name():
    o = input("Enter a letter: ")
    for y , q in movies.items():
        for value in q:
            if (value[0]) == o.upper() or o.lower() :
                names.insert(1, (y , value))
    print_list(names)
         
def print_list(e):
    for l in e:
    for w in l:
        print(w.strip("\n"))


load_movies()
get_movies_by_name()
问题排查

核心错误在get_movies_by_name函数的if判断逻辑:
原判断条件(value[0]) == o.upper() or o.lower()中,or o.lower()是独立判断项,非空字符串在Python中布尔值为True,因此无论电影名首字母是什么,if条件永远成立,所有电影都会被加入结果列表。
代码另外存在两处问题:

  • print_list函数内层for循环缩进错误,运行会触发语法报错
  • 全局列表names、years未在每次查询前清空,多次查询会累加历史结果;使用insert(1, 元素)插入数据会导致返回结果顺序倒置
修复后代码
movies = {}
def load_movies():
    with open("movie_data.txt", "r") as document:
        for line in document:
            # 限制只分割1次,避免电影名内含逗号导致解析错误
            k, v = line.strip().split(",", 1)
            if k not in movies:
                movies[k] = []
            movies[k].append(v)

def get_movies_by_year():
    years = []
    x = input("Enter a year: ").strip()
    for year, movie_list in movies.items():
        if x == year:
            years.extend(movie_list)
    return years

def get_movies_by_name():
    names = []
    o = input("Enter a letter: ").strip()
    target_char = o.upper()
    for year, movie_list in movies.items():
        for movie_name in movie_list:
            clean_name = movie_name.strip()
            # 统一转大写后对比首字符,自动忽略名称前后空格
            if clean_name and clean_name[0].upper() == target_char:
                names.append((year, clean_name))
    print_list(names)
         
def print_list(e):
    for item in e:
        year, name = item
        print(year, name)

load_movies()
get_movies_by_name()

内容的提问来源于stack exchange,提问作者benegos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:57:11