【问题标题】:Bubble sort in linked list. How do I make it sort by artist name?链表中的冒泡排序。如何按艺术家姓名排序?
【发布时间】:2019-06-08 09:43:03
【问题描述】:

我想按艺术家姓名对结果进行排序,但它不起作用。我收到AttributeError: 'str' object has no attribute 'artistName' 错误。

这是我的链接列表。我添加带有音乐 ID、音乐名称和艺术家姓名的音乐,链接列表将它们打印出来。我想按艺术家姓名按字母顺序对链接列表进行排序,但我的代码似乎不起作用。

有人可以帮我修复冒泡排序sortByArtistError(),因为我认为现在我的代码是用于数字的,但是如何让它按字母排列,特别是艺术家姓名?

【问题讨论】:

  • 显示的示例代码没有实现方法sortByArtistName(),或者这里没有显示。
  • 抱歉忘记添加现在添加
  • q = p.artistName -- q 现在是一个字符串。 'q.artistName' 应该是什么意思?
  • 既然您可以使用list 并使用标准sort/sorted 对其进行排序,为什么还要创建一个新列表?
  • 不能在列表中使用buoilt

标签: python bubble-sort


【解决方案1】:

我没有足够的声誉来发表简单的评论,但请查看this answer。 您应该为您的链接列表实现一种排序算法,在上面的链接答案中,您可以看到合并排序实现。当然是用艺术家的名字来比较元素。

编辑:和here is an insertion sort

【讨论】:

    【解决方案2】:

    您的代码令人困惑,因为您尝试在不同的上下文中使用名称 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
    

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2012-09-29
      • 2012-07-19
      相关资源
      最近更新 更多