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

如何用字典存储类对象集合?Python MovieList类实现问询

用字典存储类对象并实现MovieList类的指定功能

需求:

  • 使用字典存储一组Movie类对象,设置合适的键值对
  • 定义Python类MovieList并实现以下方法:
    1. 构造函数创建MovieList对象
    2. 用字典存储Movie类的电影对象集合
    3. 支持按标题、类型或上映日期搜索电影
    4. 按标题移除电影
    5. 计算并返回电影总数
    6. 代码包含错误检查与详细注释

以下是完整的实现代码,包含详细注释和错误处理:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:30:37