首页 > 解决方案 > Python检查列表中已存在元素

问题描述

我想确保添加同一部电影,但不幸的是,有些事情没有解决。我究竟做错了什么?

class Movie:
    def __init__(self, name, pegi, year):
        self.name = name
        self.pegi = pegi
        self.year = year

class Movies(Movie):

    def __init__(self):
        self.collection = []

    def addMovieToCollection(self, name, pegi, year):
        super().__init__(name, pegi, year)
        structure_of_movie = name + " - " + pegi + " - " + str(year)
        if structure_of_movie in self.collection :
            print("That movie like" + self.name + " already exists")
        else:
            self.collection.append(structure_of_movie)

    def showMovie(self):
        return print(*self.collection, sep='\n')

f = Movies()

f.addMovieToCollection("Iron Man 1", "blue sign", 1995)
f.addMovieToCollection("Iron Man 1", "blue sign", 1995)
f.addMovieToCollection("Iron Man 2", "+7", 1995)
f.addMovieToCollection("Iron Man 3", "+16", 1995)
f.addMovieToCollection("Iron Man 4", "+12", 1995)
f.addMovieToCollection("Iron Man 5", "+18", 1995)
f.showMovie()
   

请帮我

标签: python

解决方案


在类中添加__eq____hash__方法,如下所示:

class Movie:
    def __init__(self, name, pegi, year):
        self.name = name
        self.pegi = pegi
        self.year = year

    def __eq__(self, other): 
        if not isinstance(other, Movie):
            # don't attempt to compare against unrelated types
            return NotImplemented

        return self.name == other.name # and self.year == other.year
    
    def __hash__(self):
        return hash(self.name)
        # if you want to compare with year too.
        # return hash(self.name + str(self.year))   
      
    def __str__(self):
        # This is how each movie will be printed. 
        # You can improve the formatting here.
        return "Movie name: {}, Year: {}".format(self.name, self.year)

class Movies(): # it makes no sense that Movies should inherit Movie, don't do that.

    def __init__(self):
        self.collection = set()

    def addMovieToCollection(self, name, pegi, year):
        current_movie = Movie(name, pegi, year)
        if current_movie in self.collection:
            print("That movie like" + current_movie.name + " already exists")
        else:
            self.collection.add(current_movie)
            print("Added " + current_movie.name + " " + str(current_movie.year))
            
    def __str__(self):
        # Join the collection together how you would like to represent it.
        response = "\nMovies Collection:\n"
        for movie in self.collection:
            response += str(movie) + "\n"
        return response

f = Movies()

f.addMovieToCollection("Iron Man 1", "blue sign", 1995)
f.addMovieToCollection("Iron Man 2", "+7", 1995)
f.addMovieToCollection("Iron Man 1", "blue sign", 1996)
f.addMovieToCollection("Iron Man 1", "blue sign", 1995)
print(f)

输出:

Added Iron Man 1 1995
Added Iron Man 2 1995
That movie likeIron Man 1 already exists
That movie likeIron Man 1 already exists

Movies Collection:
Movie name: Iron Man 2, Year: 1995
Movie name: Iron Man 1, Year: 1995
Iron Man 11995

最后要打印电影,我建议您__str__在两个类中实现方法。 Movie__str__应返回 1 部电影。并且Movies__str__应该返回电影列表。

希望这可以帮助。


推荐阅读