gpt4 book ai didi

python - 对元组排序时忽略不可排序的数据类型

转载 作者:行者123 更新时间:2023-12-01 05:21:13 40 4
gpt4 key购买 nike

我正在从书中自学 Python,但我陷入了编程练习。本练习的目的是创建一个对象列表,然后根据某些对象属性对这些对象进行排序。

我的教科书的作者说,在排序过程中使用键为每次比较调用类方法可以减慢大型数据集的排序时间,并且通过为每个对象调用一次类方法来构建“装饰”列表,如下所示你构建的列表可以让后续的排序更加高效。编程问题规定,我应该创建一系列元组,而不是键,其中元组元素 0 是对象属性的字面值,元组元素 1 是对象本身。获得装饰列表后,我可以使用内置列表排序方法(例如“sorted()”或“.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()

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

[(21, <__main__.Shrubber object at XxXEX>), (21, <__main__.Shrubber object at YxYEY>), (25, <__main__.Shrubber object at ZxZEZ>), (30, <__main__.Shrubber object at QxQEQ>)]

...但是,它给了我一个 TypeError:

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

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

我的问题:我可以稳定地按元组元素 0 对元组列表进行排序并忽略不可排序的元组元素 1 吗?

最佳答案

在这些情况下,我不知道如何让它忽略第二个元素。另一种方法是向对象的类添加一个方法,该方法将返回所需的信息。这样做将避免需要传递 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()

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

[(21, <__main__.Shrubber object at 0x00C1D830>),
(21, <__main__.Shrubber object at 0x00C1D9D0>),
(25, <__main__.Shrubber object at 0x00C1DA30>),
(30, <__main__.Shrubber object at 0x00C1D9F0>)]

关于python - 对元组排序时忽略不可排序的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22317436/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com