通过类方法按字母顺序排列列表

时间:2016-04-30 21:21:43

标签: python list class dictionary alphabetical

我一直在尝试使用类的__str__方法打印列表,但在列表可以打印之前,必须通过类中__str__方法之前的其他方法按字母顺序排列。提供的方法是:

def returnName(self):
    '''return the name of the player first last'''

    return(self.first + self.last)

def returnReverseName(self):
    '''return the name of the player as last, first'''
    reverseName = (str(self.last), str(self.first))
    return(reverseName)

def __eq__ (self, other):
    '''determine if this persons name is the same as the other personsname'''

    if self.returnReverseName == other.returnReverseName:
        return True
    else:
        return False


def __lt__(self,other):
    '''determine if this persons name is less than the other persons name alphabetically'''

    if str(self.returnReverseName) < str(other.returnReverseName):
        return True
    else:
        return False

def __gt__ (self, other):
    '''determine if this persons name is greater than the other persons name alphabetically'''

    if self.returnReverseName > other.returnReverseName:
        return True
    else:
        return False

def __str__(self):
    '''return a string of the persons name and their rating in a nice format'''

    Name1 = str(self.first) + ' ' + str(self.last)
    return ('%-20s %10.2f' % (Name1, self.rating))

其中名称需要按姓氏,名字排序,但以名字姓氏顺序打印。方法__lt____gt__是打印时应该排序的方法。到目前为止我编译列表的代码是:

basicList.sort()
for line in playerDict:
    print(playerDict[line])

但这不利用列表,只是以无序方式逐行打印字典。虽然它确实引用了方法,但它无法按字母顺序排列名称。如何正确使用这些方法以正确的顺序打印字典?如果我需要使用播放器对象列表,如何使用在字母后化后打印的__str__方法进行打印?

1 个答案:

答案 0 :(得分:1)

这段代码有很多错误和奇怪之处,但它做的第一件事实际上可能导致错误的结果是__eq____gt__正在比较两个函数而不是两个名字。 __lt__由于某种原因,比较了这两个函数的字符串表示。我不知道为什么它与其他功能有不同的行为,但它仍然是错误的(只是以不同的方式)。

我对排序列表没有使用并不感到惊讶 - 你永远不会使用它。

basicList.sort() # sort the list
for line in playerDict: # that's not basicList
    print(playerDict[line]) # still no basicList

您的课程方法(如果已修复)可能如下所示:

def returnName(self):
    '''return the name of the player first last'''
    return(self.first + ' ' + self.last)

def returnReverseName(self):
    '''return the name of the player as last, first'''
    return self.last, self.first

def __eq__ (self, other):
    '''determine if this persons name is the same as the other personsname'''
    return self.returnReverseName() == other.returnReverseName()

def __lt__(self,other):
    '''determine if this persons name is less than the other persons name alphabetically'''
    return self.returnReverseName() < other.returnReverseName()

def __gt__ (self, other):
    '''determine if this persons name is greater than the other persons name alphabetically'''
    return self.returnReverseName() > other.returnReverseName()

def __str__(self):
    '''return a string of the persons name and their rating in a nice format'''
    return '%-20s %10.2f' % (self.returnName(), self.rating)

但你可能不需要这些。看起来playerDict是一个字典,它包含附加到Player个对象的值的某种键(我假设它是类名)。只需迭代这些值并使用给定的排序键:

for entry in sorted(playerDict.values(), key=lambda x: x.last, x.first):
    print(entry)