-
operator.attrgetter()
-
返回:返回从其操作数获取attr的可调用对象。如果请求多个属性,则返回属性元组。
- attrgetter()实现代码:官方标准库3.7
def attrgetter(*items): if any(not isinstance(item, str) for item in items): raise TypeError('attribute name must be a string') if len(items) == 1: attr = items[0] def g(obj): return resolve_attr(obj, attr) else: def g(obj): return tuple(resolve_attr(obj, attr) for attr in items) return g def resolve_attr(obj, attr): for name in attr.split("."): obj = getattr(obj, name) return obj
- 示例:
class Teacher(): def __init__(self, name, salary, age): self.name = name self.age = age self.salary = salary def __repr__(self): return repr((self.name,self.age,self.salary)) teachers = [ Teacher("A",1200,30), Teacher("B",1200,31), Teacher("C",1300,30) ] from operator import attrgetter print(sorted(teachers,key=attrgetter("age"))) # 根据age排序 print(sorted(teachers,key=attrgetter("salary","age"))) # 根据salary和age排序 结果: [('A', 30, 1200), ('C', 30, 1300), ('B', 31, 1200)] [('A', 30, 1200), ('B', 31, 1200), ('C', 30, 1300)]
-
operator.itemgetter()
-
返回一个可调用对象,该对象使用操作数的__getitem __()方法从其操作数中获取项。如果指定了多个项,则返回一个查找值元组。
- itemgetter()实现代码:官方标准库3.7
def itemgetter(*items): if len(items) == 1: item = items[0] def g(obj): return obj[item] else: def g(obj): return tuple(obj[item] for item in items) return g
- 示例:
>>> itemgetter(1)('ABCDEFG') 'B' >>> itemgetter(1,3,5)('ABCDEFG') ('B', 'D', 'F') >>> itemgetter(slice(2,None))('ABCDEFG') 'CDEFG' >>> soldier = dict(rank='captain', name='dotterbart') >>> itemgetter('rank')(soldier) 'captain' >>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)] >>> getcount = itemgetter(1) >>> list(map(getcount, inventory)) [3, 2, 5, 1] >>> sorted(inventory, key=getcount) [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]