python - 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()
请帮我
解决方案
在类中添加__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__
应该返回电影列表。
希望这可以帮助。
推荐阅读
- javascript - Javascript ES6 - 是否可以在子类中不使用 this 关键字的情况下使用/调用超类属性或函数
- xamarin - 使用 Xamarin.Forms MessagingCenter 在 ViewModel 和方法之间进行通信有什么优点或缺点吗
- html - 什么时候需要为语义添加类?
- msal - 是否可以使用从 MSAL(MS 身份平台)收到的 JWT Bearer 来访问 MS AppCenter API?
- spring-boot - 如何在 Wildfly14 上配置 JavaMailSender
- python - glob 多个 CSV 和 np.arange
- react-native - 如何在文本输入的不同行中显示占位符?
- excel - 根据主表上的单元格值隐藏工作表时出错
- python-3.x - 如何获取相同键值的响应标头
- c# - 带有 MVVM 的 SplitView 的窗格内容模板