如何对Python类实例列表按名称长度倒序排序?遇报错求解答
问题分析与解决方法
错误原因
你调用itemlist.sort(key=len, reverse=True)时,sort方法会把列表里的每个item实例直接传给len函数,而你的自定义item类没有实现让实例支持len()调用的方法,Python无法计算实例的长度,因此抛出TypeError: object of type 'item' has no len()。
核心问题是:你想按实例的name属性的长度排序,但直接传len会让Python去计算实例本身的长度,这和你的需求不符。
解决方法
方法1:用lambda表达式(新手友好,直观)
把key参数改成一个lambda函数,明确告诉Python要取每个实例的name属性,再计算它的长度:
itemlist.sort(key=lambda x: len(x.name), reverse=True)
lambda x:指代列表里的每个item实例len(x.name):计算该实例name属性的字符串长度,sort会依据这个长度值排序reverse=True:设置为从长到短的降序排序
方法2:结合operator模块(适合多属性排序场景)
如果后续需要频繁按类属性排序,可以用operator.attrgetter先获取属性,再计算长度:
from operator import attrgetter itemlist.sort(key=lambda x: len(attrgetter('name')(x)), reverse=True)
这个方法和lambda逻辑一致,只是把属性获取的逻辑抽离出来,复杂场景下更易维护。
示例验证
假设你的item类定义如下,运行以下代码可验证排序效果:
class item: def __init__(self, name): self.name = name # 创建测试实例列表 itemlist = [item("apple"), item("banana"), item("cherry"), item("date")] # 执行排序 itemlist.sort(key=lambda x: len(x.name), reverse=True) # 打印排序后的结果 for item_obj in itemlist: print(item_obj.name)
输出结果:
banana cherry apple date
内容的提问来源于stack exchange,提问作者Audrey Sims-Hunt
相关产品推荐
相关产品推荐

