如何按指定字段排序包含musicCD类对象的二维列表?
解决类对象列表的排序问题
嘿,我明白你的困扰啦!你之前尝试的itemgetter(1)或者lambda x: x[1]都是针对列表、元组这类可以通过索引直接访问元素的场景,但你的ArrayCD里存储的是musicCD类的实例对象,得通过调用对象的方法来获取排序依据才行~
正确的排序方法
方法1:使用Lambda表达式(最直观)
直接在key参数里定义一个lambda函数,接收每个musicCD对象,调用你需要的getter方法返回字段值作为排序键:
# 按getEdition()返回值升序排序 ArrayCD = sorted(ArrayCD, key=lambda cd: cd.getEdition()) # 如果需要倒序,加上reverse=True参数 ArrayCD = sorted(ArrayCD, key=lambda cd: cd.getEdition(), reverse=True)
方法2:使用operator.methodcaller(更简洁)
如果你喜欢更简洁的写法,可以用operator模块里的methodcaller,它专门用来调用对象的方法:
from operator import methodcaller # 按getEdition()排序 ArrayCD = sorted(ArrayCD, key=methodcaller('getEdition')) # 倒序同样加reverse=True ArrayCD = sorted(ArrayCD, key=methodcaller('getEdition'), reverse=True)
其他字段排序示例
要是你想按其他字段排序,只需要替换对应的getter方法就行:
- 按歌手排序:
key=lambda cd: cd.getSinger()或者key=methodcaller('getSinger') - 按唱片数量排序:
key=lambda cd: cd.getRecordsCount()或者key=methodcaller('getRecordsCount')
验证排序结果
排序后可以用你原来的遍历方式确认结果:
for cd in ArrayCD: print(cd.getSinger(), cd.getEdition(), cd.getRecordsCount())
为什么之前的方法失败?
你之前用的x[1]是试图把musicCD对象当成可索引的容器(比如列表、元组)去取第2个元素,但你的对象是自定义类的实例,并不支持索引访问,所以会触发错误。我们需要通过对象自身的方法来获取排序所需的字段值,这才是正确的打开方式~
内容的提问来源于stack exchange,提问作者gred
相关产品推荐
相关产品推荐

