我正在从一本书中自学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吗?在
在这种情况下,我不知道如何使它忽略第二个元素。另一种方法是向对象的类中添加一个方法,该方法将返回所需的信息。这样做可以避免传递
sort()
一个key=
函数。我的意思是:输出(为了可读性而包装):
^{pr2}${bber>如果你没有实现一个shrubl1>函数,请确保你从来没有通过比较。一种方法是在元组中插入另一个整数:
但是,从所有角度来看这都是错误的,您应该使用
key=
函数。这很难读,根据我的测量,它大约慢了四倍。不过,使用__lt__
(或不推荐使用的cmp=
)则更糟糕,大约慢了两倍。在最后要说明的是,以这种方式附加到列表中不是python方法。您可以这样做:
^{pr2}$相关问题 更多 >
编程相关推荐