在列表中调用对象
class MySong:
_songTitle = "Song Title"
_artistName = "Artist Name"
_likeIndicator = -1
def setTitleAndArtist(self, songTitle, artistName):
self._songTitle = songTitle
self._artistName = artistName
def setLike(self, likeIndicator):
self._likeIndicator = likeIndicator
def undoSetLike(self, songTitle):
Null
def getTitle(self):
return self._songTitle
def getArtist(self):
return self._artistName
def getLikeIndicator(self):
return self._likeIndicator
class MyPlaylist:
_mySongs = []
def add(self, song):
self._mySongs.append(song)
def showTitles(self):
index = 0
titlesList = []
while index != len(self._mySongs):
titlesList.append(self._mySongs[index].getTitle())
index = index + 1
return titlesList
def remove(self):
remindex = 0
while remindex != len(self._mySongs):
if (self._mySongs[index].getTitle()) == remChoice :
return("Song FOUND debug!")
self._mySongs.remove(index)
else:
remindex = remindex + 1
return("Song NOT FOUND debug!")
def getMySong(self):
Null
在 _mySongs = []
这个列表里,有一堆歌曲对象。我想根据这些对象的标题来删除一首歌。
在程序的另一个部分(这里没有显示),用户会被要求输入他们想要删除的歌曲标题,这个标题会被保存为 remChoice
。
我不太确定怎么根据标题来删除这首歌。我尝试了很久,显然我们是通过调用 getTitle 方法来匹配标题,从而找到歌曲在列表中的位置,然后在找到后删除那个位置的歌曲。
可是这样并没有成功。我哪里出了问题呢?
2 个回答
0
试着用下面这行代码:
self._mySongs.remove(title)
这应该能解决问题。
(如果你是在另一个对象里使用这段代码,可以把“self”换成你对象的名字。)
0
如果你想从一个列表中删除一个项目,并且你知道它的索引,可以使用:
del xs[i]
这里的i
就是索引。(比如:你根据搜索得到的歌曲索引)
list.remove()
是用来删除列表中与给定元素匹配的项,而不是删除“第i个”项目。
你可能会发现,list
在这里并不是一个合适的数据结构?也许你可以尝试用dict
来存储键/值对。例如:
my_songs = {}
my_aongs["My Song Title"] = MySong(title, description, length)
你可以通过它们的键来删除歌曲:
del my_songs["My Song Title"]
这里的标题就是你的键。这样可以避免进行O(n)的搜索。
更新:
你的.remove()
方法应该更像下面这样:
def remove(self, title):
for i, song in enumerate(self._mySongs):
if song.getTitle() == title:
del self._mySongs[i]
return
print("Song not found!")
这里我们使用了list
的迭代协议,通过for x in xs:
来遍历,而不是使用while循环和手动管理索引。内置函数enumerate()
也被用来给我们提供正在遍历的列表的索引(也就是它在序列中的位置)。