在List中调用Object

时间:2014-05-20 02:21:25

标签: python list

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 = []内有一个歌曲对象列表。我试图根据该对象的title变量删除一个。

在程序的单独(未示出)部分中,要求用户输入要作为字符串删除的歌曲的标题。保存为remChoice

我不完全确定如何根据标题删除歌曲。 我已经尝试了一段时间才能实现它,显然我们通过将它与标题匹配(通过调用getTitle方法)找到列表中的歌曲索引,然后在找到它时删除该索引

这不起作用。我哪里错了?

2 个答案:

答案 0 :(得分:0)

self._mySongs.remove(title) 这应该工作。 (或者来自另一个对象:用你的对象名称替换self)

答案 1 :(得分:0)

如果您要删除list知道其使用索引的项目:

del xs[i]

其中i是索引。 (例如:您的歌曲基于您的搜索的索引)。

list.remove()用于从列表中删除匹配元素,而不是" ith"项目

您可能还会发现list不是合适的数据结构吗?也许您可以尝试在dict中存储键/值对。 e.g:

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而不是使用while循环并进行手动记录来使用for x in xs:的迭代协议。内置函数enumerate()还用于为我们提供一个索引,我们将重复迭代(即:它在序列中的位置)。