如何用字典存储类对象集合?Python MovieList类实现问询
用字典存储类对象并实现MovieList类的指定功能
需求:
- 使用字典存储一组Movie类对象,设置合适的键值对
- 定义Python类
MovieList并实现以下方法:
- 构造函数创建
MovieList对象- 用字典存储
Movie类的电影对象集合- 支持按标题、类型或上映日期搜索电影
- 按标题移除电影
- 计算并返回电影总数
- 代码包含错误检查与详细注释
以下是完整的实现代码,包含详细注释和错误处理:
class Movie: """电影类,存储单部电影的基本信息""" def __init__(self, title, genre, release_date): self.title = title.strip() # 去除标题前后空格,避免键值不一致 self.genre = genre.strip() self.release_date = release_date.strip() def __repr__(self): # 自定义打印格式,方便查看电影信息 return f"Movie(title='{self.title}', genre='{self.genre}', release_date='{self.release_date}')" class MovieList: """电影列表类,用字典管理电影对象集合""" def __init__(self, name, max_movies): """ 构造函数初始化电影列表 :param name: 电影列表的名称(比如"我的收藏") :param max_movies: 列表可容纳的最大电影数量 """ self.name = name.strip() # 限制最大容量为正整数,否则默认设为10 self.max_movies = max_movies if isinstance(max_movies, int) and max_movies > 0 else 10 # 用字典存储电影,键为电影标题(唯一标识),值为Movie对象 self.movie_dict = {} def add_movie(self, movie): """ 添加电影到列表 :param movie: 要添加的Movie对象 :return: 添加成功返回True,失败返回False """ # 错误检查:确保传入的是Movie对象 if not isinstance(movie, Movie): print("错误:只能添加Movie类的对象") return False # 检查电影标题是否已存在(避免重复) if movie.title in self.movie_dict: print(f"错误:电影《{movie.title}》已存在于列表中") return False # 检查是否超过最大容量 if len(self.movie_dict) >= self.max_movies: print(f"错误:电影列表已达最大容量({self.max_movies}部),无法添加新电影") return False # 所有检查通过,添加电影 self.movie_dict[movie.title] = movie print(f"电影《{movie.title}》已成功添加") return True def search_movies(self, search_type, keyword): """ 根据指定类型搜索电影 :param search_type: 搜索类型,可选值为"title"、"genre"、"release_date" :param keyword: 搜索关键词 :return: 匹配的Movie对象列表,无匹配则返回空列表 """ # 错误检查:验证搜索类型是否合法 valid_types = ["title", "genre", "release_date"] if search_type not in valid_types: print(f"错误:不支持的搜索类型,请选择{valid_types}中的一种") return [] keyword = keyword.strip().lower() # 统一转为小写,实现不区分大小写搜索 matched_movies = [] for movie in self.movie_dict.values(): # 根据搜索类型匹配关键词 if search_type == "title" and keyword in movie.title.lower(): matched_movies.append(movie) elif search_type == "genre" and keyword in movie.genre.lower(): matched_movies.append(movie) elif search_type == "release_date" and keyword in movie.release_date.lower(): matched_movies.append(movie) return matched_movies def remove_movie(self, title): """ 根据标题移除电影 :param title: 要移除的电影标题 :return: 移除成功返回True,失败返回False """ title = title.strip() # 检查电影是否存在 if title not in self.movie_dict: print(f"错误:电影《{title}》不存在于列表中") return False # 移除电影 del self.movie_dict[title] print(f"电影《{title}》已成功移除") return True def get_total_movies(self): """返回当前列表中的电影总数""" return len(self.movie_dict) # 测试示例 if __name__ == "__main__": # 创建电影列表,最大容量5部 my_movies = MovieList("我的私人影库", 5) # 创建几部电影 movie1 = Movie("肖申克的救赎", "剧情", "1994-09-23") movie2 = Movie("盗梦空间", "科幻", "2010-09-01") movie3 = Movie("阿甘正传", "剧情", "1994-07-06") # 添加电影 my_movies.add_movie(movie1) my_movies.add_movie(movie2) my_movies.add_movie(movie3) # 搜索剧情类电影 print("\n搜索剧情类电影:") drama_movies = my_movies.search_movies("genre", "剧情") print(drama_movies) # 搜索1994年上映的电影 print("\n搜索1994年上映的电影:") year_1994 = my_movies.search_movies("release_date", "1994") print(year_1994) # 移除电影 print("\n移除《盗梦空间》:") my_movies.remove_movie("盗梦空间") # 查看当前电影总数 print(f"\n当前电影总数:{my_movies.get_total_movies()}")
关键设计说明
- 字典键的选择:用电影标题作为字典的键,因为标题是电影的唯一标识(实际场景中若有重名,可结合上映日期等组合键),这样查找、删除操作的时间复杂度为O(1),效率更高。
- 错误检查:
- 添加电影时验证对象类型、标题重复、容量限制
- 搜索时验证搜索类型合法性
- 移除时检查电影是否存在
- 搜索优化:将关键词和电影属性统一转为小写,实现不区分大小写的模糊搜索,提升用户体验。
- 变量命名:遵循PEP8规范,使用小写下划线命名(比如
max_movies、movie_dict),替代原代码中的大驼峰命名,提高代码可读性。
内容的提问来源于stack exchange,提问作者Franklyn
相关产品推荐
相关产品推荐

