Python--operator库中的attrgetter()和itemgetter()
原文链接:https://blog.csdn.net/m0_38109046/article/details/85042607
-
返回:返回从其操作数获取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)]
-
-
返回一个可调用对象,该对象使用操作数的__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)]
-