我想按艺术家名称对结果进行排序,但是它不起作用。我收到AttributeError: 'str' object has no attribute 'artistName'
错误。
这是我的链表。我添加带有音乐ID,音乐名称和艺术家名称的音乐,然后链接列表将它们打印出来。我想按艺术家姓名的字母顺序对链接列表进行排序,但我的代码似乎无法正常工作。
有人可以帮我解决冒泡排序sortByArtistError()
的问题,因为我现在认为我的代码是数字的,但是如何按字母特别是艺术家的名字排列呢?
答案 0 :(得分:0)
我没有足够的声誉来发表简单的评论,但请查看this answer。 您应该为链接列表实现一种排序算法,在上面的链接答案中,您可以看到“合并排序”实现。当然,请使用艺术家的名字来比较元素。
答案 1 :(得分:0)
您的代码令人困惑,因为您尝试在不同的上下文中使用名称next
。通常,不建议将关键字用作对象名称。同样,您应该仔细研究如何使用相应的dunder方法来实现迭代器协议。在我看来,您在那里错过了一些东西。
话虽如此,我想出了一些更干净的代码。它当然不是最佳选择,但是出于可读性考虑,您可以将其用作进行进一步研究的起点。
对于节点类,我用属性对象替换了您的getter和setter方法。这样,您可以像属性一样访问变量,但是在后台会调用相应的getter和setter。这样可以节省很多打字。
class Node:
def __init__(self, newData=None, nextNode=None):
self.data = newData
self.nxt = nextNode
@property
def data(self):
return self._data
@data.setter
def data(self, newData):
self._data = newData
@property
def nxt(self):
return self._nxt
@nxt.setter
def nxt(self, newNode):
self._nxt = newNode
这仍然没有改变:
class Music :
def __init__(self, id, musicName, artistName):
self.id = id
self.musicName = musicName
self.artistName = artistName
#defining how the string is displayed
def __repr__(self):
#adds in and formats the id, musicName, and artistName added to the Music collection
return f'Music ID: {self.id}\nMusic Name: {self.musicName}\nArtist Name: {self.artistName}\n'
没有。为了能够遍历链接列表,您需要__iter__
和__next__
dunder方法。此后可以用于iteritems
函数,该函数又可以用于显示列表。
对于所请求的冒泡排序,功劳归于this github repo,我仅将其用于此上下文。我没有检查这是否是最快的实现,但是它可以工作。
class LinkedList:
def __init__(self):
self.head = None
self.size = 0
def __iter__(self):
self.pointer = self.head
return self
def __next__(self):
if self.pointer is None:
raise StopIteration
curr, self.pointer = self.pointer, self.pointer.nxt
return curr
def get_size(self):
return self.size
def iteritems(self):
for pos, node in enumerate(self):
yield pos, node
def addMusicToFront(self, newData):
newNode = Node(newData, self.head)
self.head = newNode
self.size += 1
def displayMusic(self):
for _, node in self.iteritems():
print(node.data)
def sortByArtistName(self):
sorted = False
count = 0
while not sorted:
sorted = True
prev = self.head
curr = self.head.nxt
while curr is not None:
if prev.data.artistName > curr.data.artistName:
sorted = False
prev.data, curr.data = curr.data, prev.data
count += 1
prev = curr
curr = curr.nxt
MusicList = LinkedList()
MusicList.addMusicToFront(Music(1, "walkingdead", "beter"))
MusicList.addMusicToFront(Music(2, "pokemon", "albert"))
MusicList.addMusicToFront(Music(3, "power ranger", "dylan"))
MusicList.addMusicToFront(Music(4, "man", "carry"))
MusicList.sortByArtistName()
MusicList.displayMusic()
在我的机器上(使用Python 3.6),这将产生以下输出:
Music ID: 2
Music Name: pokemon
Artist Name: albert
Music ID: 1
Music Name: walkingdead
Artist Name: beter
Music ID: 4
Music Name: man
Artist Name: carry
Music ID: 3
Music Name: power ranger
Artist Name: dylan