You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中sorted()用attrgetter对字典列表排序报AttributeError问题

错误原因
  • 第一个问题是operator.attrgetter的用法完全用错了:attrgetter接收的参数是你要提取的属性名的字符串,不需要你主动去访问属性,它会自动对sorted()遍历到的每个元素执行属性提取操作。你写的hnlist.votes是直接尝试访问整个排序对象列表hnlist的votes属性,而hnlist本身是列表类型,本来就没有这个属性,这就是报错AttributeError: 'list' object has no attribute 'votes'的直接原因。
  • 第二个问题是attrgetter的适用场景错误:attrgetter是用来提取类实例对象的属性的,也就是用对象.属性名方式访问的内容;而你存入列表的是字典,字典的键值需要用字典['键名']方式访问,完全不匹配attrgetter的适用场景。
修复方案

你有两种可选的修复方式:

  1. 改用适配字典的operator.itemgetter,效果和你注释里的lambda写法完全等价:
    首先导入itemgetter:
from operator import itemgetter

排序代码修改为:

def sort_stories_by_votes(hnlist):
    return sorted(hnlist, key=itemgetter('votes'), reverse=True)
  1. 如果你要保留attrgetter用法,需要将存储的字典改为自定义类的实例:
    先定义数据结构类:
class HackerNewsItem:
    def __init__(self, title, link, votes):
        self.title = title
        self.link = link
        self.votes = votes

构造列表时修改为:

hn.append(HackerNewsItem(title=title, link=href, votes=points))

排序代码修改为:

def sort_stories_by_votes(hnlist):
    return sorted(hnlist, key=attrgetter('votes'), reverse=True)

内容的提问来源于stack exchange,提问作者user10787418

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:27:03