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
相关产品推荐
相关产品推荐

