Python如何在嵌套字典内的列表中查找指定电影字典并实现跨列表移动
代码问题分析
你的现有代码存在两个核心逻辑错误:
- 判断条件
if title in user_data是检查title是否是外层user_data字典的键,完全不符合「检查watchlist里有没有对应标题的电影」的需求 watchlist列表里存的是电影字典,不是字符串类型的标题,直接调用remove(title)会抛出ValueError异常,根本找不到匹配项
修正后代码
默认你的电影字典里存储标题的键是title,如果实际键名不一样自行替换即可:
def watch_movie(user_data, title): # 遍历watchlist查找匹配标题的电影 for movie in user_data["watchlist"]: if movie.get("title") == title: # 找到后移动到watched列表 user_data["watchlist"].remove(movie) user_data["watched"].append(movie) break # 无论有没有找到都返回user_data,和原有返回逻辑保持一致 return user_data
如果能确保所有电影字典都有标题字段,也可以把movie.get("title")换成movie["title"]
可选优化点
- 如果需要支持找不到电影时返回提示,可以加标识位:
def watch_movie(user_data, title): found = False for movie in user_data["watchlist"]: if movie.get("title") == title: user_data["watchlist"].remove(movie) user_data["watched"].append(movie) found = True break return user_data, found # 调用时可以接收第二个返回值判断是否找到
- 如果watchlist数据量很大,遍历查找效率低,可以预先给watchlist建立标题到电影字典的映射,一般个人项目电影列表不会超过几千条,遍历完全够用
- 可以增加参数校验,防止传入的user_data缺少
watchlist或者watched键时报错:
def watch_movie(user_data, title): if "watchlist" not in user_data or "watched" not in user_data: raise ValueError("传入的user_data缺少必要的watchlist或watched字段") for movie in user_data["watchlist"]: if movie.get("title") == title: user_data["watchlist"].remove(movie) user_data["watched"].append(movie) break return user_data
内容的提问来源于stack exchange,提问作者sasquatchphd
相关产品推荐
相关产品推荐

