在列表中调用对象

0 投票
2 回答
835 浏览
提问于 2025-04-18 07:03
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()也被用来给我们提供正在遍历的列表的索引(也就是它在序列中的位置)。

撰写回答