忽略不可排序的数据类型在排序tup时

2024-09-26 18:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从一本书中自学Python,而我却被困在编程练习上。这个练习的目的是列出一个对象列表,然后根据某个对象属性对这些对象进行排序。在

我的教科书的作者说,在排序过程中,使用一个键为每次比较调用一个类方法可以降低大型数据集的排序时间,并且在构建列表时为每个对象只调用一次class方法来构建一个“修饰”列表可以使后续的排序更加高效。编程问题规定,我应该生成一系列元组,其中元组元素0是对象属性的字面值,元组元素1是对象本身。在我有了装饰列表之后,我可以使用一个内置的列表排序方法(例如“sorted()”或“.sort()”,等等)来将其排列整齐。在

当两个对象具有相同的sort属性值时,我得到一个错误。此示例代码将重现错误:

class Shrubber:
    def __init__(self, age):
        self.name = 'Roger'
        self.age = age

    def getAge(self):
        return self.age

def main():
    rogerAges = [30, 21, 21, 25]
    rogers = []
    for rAge in rogerAges:
        newShr = Shrubber(rAge)
        rogers.append((newShr.getAge(), newShr))
    rogers.sort()
    print(rogers)

main()

我希望程序打印如下内容:

^{pr2}$

…但是它却给了我一个输入错误:

TypeError: unorderable types: Shrubber() < Shrubber()

我确信我得到了错误,因为Python遇到两个元组元素0的两个相同值后,它查找元素1并找到一个无序的数据类型(对象)。然而,两个灌木丛不能是同一个年龄的限制让我看起来好像错过了什么。在

我的问题:我能稳定地按元组元素0对元组列表排序,而忽略无序的元组元素1吗?在


Tags: 对象方法self元素列表age属性排序
2条回答

在这种情况下,我不知道如何使它忽略第二个元素。另一种方法是向对象的类中添加一个方法,该方法将返回所需的信息。这样做可以避免传递sort()一个key=函数。我的意思是:

class Shrubber:
    def __init__(self, age):
        self.name = 'Roger'
        self.age = age

    def getAge(self):
        return self.age

    def __lt__(self, other):  # added comparison method
        return self.age < other.age

def main():
    rogerAges = [30, 21, 21, 25]
    rogers = []
    for rAge in rogerAges:
        newShr = Shrubber(rAge)
        rogers.append((newShr.getAge(), newShr))
    rogers.sort()
    print(rogers)

if __name__ == '__main__':
    main()

输出(为了可读性而包装):

^{pr2}$

{bber>如果你没有实现一个shrubl1>函数,请确保你从来没有通过比较。一种方法是在元组中插入另一个整数:

def main():
    rogerAges = [30, 21, 21, 25]
    rogers = list()
    for i, rAge in enumerate(rogerAges):
        newShr = Shrubber(rAge)
        rogers.append((newShr.getAge(), i, newShr))
    rogers.sort()
    print(rogers)

但是,从所有角度来看这都是错误的,您应该使用key=函数。这很难读,根据我的测量,它大约慢了四倍。不过,使用__lt__(或不推荐使用的cmp=)则更糟糕,大约慢了两倍。在

最后要说明的是,以这种方式附加到列表中不是python方法。您可以这样做:

^{pr2}$

相关问题 更多 >

    热门问题