我想知道当我对一些对象进行排序时,在什么情况下是操作员。 attrgetter(),或operator.itemgetter()

I want to know when I'm sorting some objects, in what case is the operator. attrgetter (),or operator.itemgetter()

我想知道它们之间的区别。 例如:对列表进行排序我遇到了问题:

list=[{'name':'david','age':12},{'name':'lily','age':12},{'name':'kee','age':12},{'name':'jimi','age':12}]

我用

sorted(list,key=operator.attrgetter('name')
AttributeError: 'dict' object has no attribute 'name'

我不知道我是使用 attrgetter() 还是 itemgetter()

正如 Jean-François Fabre 评论的那样,您询问的两个 operator 函数执行不同的操作。如果你这样做:

attrs = attrgettr("foo")
items = itemgetter("foo")

然后调用它们会给你不同的结果:

result = attrs(some_obj) # equivalent to result = some_obj.foo
result = items(some_obj) # equivalent to result = some_obj['foo']

您通常不希望将它们应用于相同种类的对象。如果您有一个可索引对象列表(如序列或映射),那么使用 itemgetter 从每个对象中获取特定项目,因为调用 list.sort 中的 key 非常有用的感觉。另一方面,如果列表中的对象不可索引,但具有有用的属性,则使用 attrgetter 会更好。

使用其中任何一个都不是必需的。您始终可以使用 lambda 表达式来构建可调用对象。 itemgetter('foo') 等同于 lambda x: x['foo']attrgetter('foo') 等同于 lambda x: x.foo。 lambda 可能比您从 operator 函数获得的可调用函数慢一点,但可能不会慢很多。但是 lambda 可以做更多,如果您需要更复杂的结果(例如 lambda x: x['foo'] - x.bar,对于具有有用属性和可索引值的奇怪对象)。