Python中sorted()用attrgetter对字典列表排序报AttributeError问题
错误原因
- 第一个问题是
operator.attrgetter的用法完全用错了:attrgetter接收的参数是你要提取的属性名的字符串,不需要你主动去访问属性,它会自动对sorted()遍历到的每个元素执行属性提取操作。你写的hnlist.votes是直接尝试访问整个排序对象列表hnlist的votes属性,而hnlist本身是列表类型,本来就没有这个属性,这就是报错AttributeError: 'list' object has no attribute 'votes'的直接原因。 - 第二个问题是
attrgetter的适用场景错误:attrgetter是用来提取类实例对象的属性的,也就是用对象.属性名方式访问的内容;而你存入列表的是字典,字典的键值需要用字典['键名']方式访问,完全不匹配attrgetter的适用场景。
修复方案
你有两种可选的修复方式:
- 改用适配字典的
operator.itemgetter,效果和你注释里的lambda写法完全等价:
首先导入itemgetter:
from operator import itemgetter
排序代码修改为:
def sort_stories_by_votes(hnlist): return sorted(hnlist, key=itemgetter('votes'), reverse=True)
- 如果你要保留
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
相关产品推荐
相关产品推荐

