【问题标题】:Updating a list in a Python class更新 Python 类中的列表
【发布时间】:2018-04-18 20:53:58
【问题描述】:

我想更新一个列表以包含用户添加的新项目。有一些条件,例如代码长度必须为 7 位。如果代码已经存在,系统会通知用户。如果用户尝试使用不同的代码添加另一个“up”副本,系统将不允许这样做。这将使他们再次尝试,因为代码必须相同。最终我将包含一个视频编号,因此如果有两个“up”副本,它们将有两个不同的视频编号但相同的视频代码。

谁能告诉我为什么下面的代码不适合我?

all_movies = []

class Movie(object):
    movie_list = []


    def __init__(self, code, title, director):
        self.code = code
        self.title = title
        self.director = director

        Movie.movie_list.append(self)

    @staticmethod
    def add_movie():

        mv_code = input("Code of movie: ")
        movie_code = int(mv_code)
        movie_title = input("Name of movie: ")
        movie_director = input("Director: ")

        if len(mv_code) == 7:
           all_movies.append(Movie(movie_code, movie_title, movie_director))

           print("movie added to database")
        else:
            print("the code must be 7 digits long, add movie again.")

        def check_validity(movie_code, all_movies):
            if movie_code in all_movies:
                return True
            else:
                return False

        if check_validity(movie_code, all_movies):
            all_movies[all_movies] += Movie
            print()
            print("updated")
        else:
            all_movies[movie_code] = [movie_code, movie_title, movie_director]

def main():
    movie1 = Movie(1122334, 'Up', 'Director')
    movie2 = Movie(1231235, 'Taxi Driver', 'Film-maker')

这是我收到的错误消息:

all_movies[movie_code] = [movie_code, movie_title, movie_director] 
IndexError: list assignment index out of range

【问题讨论】:

  • 不工作怎么办?不应该发生的事情是什么?你得到什么错误?
  • @Daniel Roseman 很抱歉没有包含我收到的错误消息。这里是:all_movies[movie_code] = [movie_code, movie_title, movie_director] IndexError: list assignment index out of range
  • 如果您有其他信息,请编辑您的问题。您无法格式化 cmets 中的代码/错误消息,人们通常不会阅读 cmets。

标签: python list class


【解决方案1】:

首先,这种结构不适合您的愿望。
关于你得到的错误,我应该说你必须将所有电影定义为字典而不是列表(因为你想为每部电影使用)。
试试这个:

all_movies = {}

在你add_movie方法:

@staticmethod
def add_movie():

    mv_code = input("Code of movie: ")
    movie_code = int(mv_code)
    movie_title = input("Name of movie: ")
    movie_director = input("Director: ")

    if len(mv_code) == 7:
       if movie_code in all_movies.keys():
           print("the movie already exists")
           # what do you want to happen here ? 
       else:
           all_movies[movie_code] = (movie_code, movie_title, movie_director)
           print("movie added to database")
    else:
        print("the code must be 7 digits long, add movie again.")

这将向all_movies 添加一部电影,您不需要其余的代码,而且我不明白initmovie_list 的用法。
试试这个,然后告诉我如果电影中已经存在代码会发生什么,我会为你更新我的答案。

更新:

根据您在评论中的愿望,该方法将更新为如下内容:

@staticmethod
def add_movie():

    mv_code = input("Code of movie: ")
    movie_code = int(mv_code)
    movie_title = input("Name of movie: ")
    movie_director = input("Director: ")

    if len(mv_code) == 7:
       if movie_code in all_movies.keys():
           print("the movie is already exists, adding it with another video number")
           # all_movies[movie_code][-1] is the last video with an existing key
           # all_movies[movie_code][-1][-1] last video number generated
           new_video_number = all_movies[movie_code][-1][-1] + 1
           all_movies[movie_code].append([movie_title, movie_director, new_video_number]) # adding it with new video number
           print("movie added to database with new video number")        
       else:
           all_movies[movie_code] = []
           all_movies[movie_code].append([movie_title, movie_director, 1]) # 1 is the first movie added(video number)
           print("movie added to database")
    else:
        print("the code must be 7 digits long, add movie again.")

这将像这样返回all_movies

{
    '1231235':[
        ['Taxi Driver', 'Film-maker', 1]
    ]
    '1122334':[
        ['Up', 'Director',1],
        ['Up', 'Director',2],
        ['Up', 'Director',3],
   ]
    '1122333':[
        ['Another movie', 'Another Director',1],
        ['Another movie', 'Another Director',2],
   ]
}

内部列表的最后一个元素是系统自动生成的video_numbers

【讨论】:

  • 感谢您的帮助。我正在为这个项目使用类,所以我必须保留初始化。如果需要,movie_list 被用于存储附加信息。我将实施更改,看看会发生什么。是否可以通过将信息保存在列表中来做到这一点,或者字典会让它变得更容易吗?
  • @user9666493 您也可以使用列表,但是您需要通过代码访问每部电影的事实将指导您在存储过程中使用字典。
  • 再次感谢您的帮助。我只是想给你更多的背景知识,这是我正在从事的一个更大项目的一部分。我希望结果如下: 视频编号:1 视频代码:1231234 标题:上 导演:迪士尼 当使用上面的代码添加新的时,它必须识别代码是相同的,并给新的视频下一个可用编号 eg: 2. 如果视频代码相同,则不能允许标题或导演不同。视频编号:2 视频代码:1231234 标题:Up 导演:迪士尼
  • @user9666493 我正在处理它。准备好后我会通知您。
猜你喜欢
  • 2018-07-06
  • 2021-06-18
  • 2023-03-05
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多