1 定义
operator.itemgetter(item)
operator.itemgetter(*items)
说明:
1.1 使用操作数的__getitem__()方法取得实例对象对应的数据项,并返回一个可调用对象;
1.2 如果要取回多个数据项,该可调用对象返回数据项的元组。
from operator import itemgetter
ls = [1, 2, 3, 4]
g = itemgetter(0)
print(g(ls)) # 1
f = itemgetter(3, 0, 1)
print(f(ls)) # (4,1,2)
这个函数的使用效果等价于:
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
2 函数的参数
2.1 任何拥有__getitem__()类的对象,均可使用这个函数
2.2 字典类型,可使用任意可哈希的值(比如:数值、字符串、实现了__hash__方法的自定义类、元组)
2.3 列表、元组、字符串,接收数据索引或者切片作为参数
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'
tips:这里的切片,可以使用命名切片,参考这篇文章:01-列表操作-使用slice()命名切片,增强程序可读及可维护性,兼使用indices()方法,防止出现序列访问异常-CSDN博客
实例1:取得元组列表中特定的区域值/对元组列表排序
from operator import itemgetter
inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
getcount = itemgetter(1)
print(list(map(getcount, inventory)))
# 返回:[3, 2, 5, 1]
print(sorted(inventory, key=getcount))
# 返回:[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
实例2:对字典/字典列表排序
1 利用zip()函数对字典内元素进行排序
from operator import itemgetter
height = {'lili':132,'lucy':180,'vivian':150,'elen':170,'Alice':175}
height_ordered = sorted(zip(height.values(),height.keys()))
print(height_ordered)
2 利用itemgetter对字典列表进行排序
persons = [
{'name': 'joe', 'height': 170, 'salary': 3200, 'dept': 1},
{'name': 'alen', 'height': 130, 'salary': 8200, 'dept': 5},
{'name': 'chary', 'height': 163, 'salary': 5200, 'dept': 3},
{'name': 'x-man', 'height': 130, 'salary': 4200, 'dept': 2},
{'name': 'bob', 'height': 180, 'salary': 7200, 'dept': 5},
{'name': 'god', 'height': 140, 'salary': 2200, 'dept': 3}
]
sort_by_dept = sorted(persons, key=itemgetter('dept'))
print(sort_by_dept)
sort_by_salary_dept = sorted(persons,key=itemgetter('salary','dept'))
print(sort_by_salary_dept)
第1个返回(按部门排序):
[{'name': 'joe', 'height': 170, 'salary': 2200, 'dept': 1},
{'name': 'x-man', 'height': 130, 'salary': 2200, 'dept': 2},
{'name': 'chary', 'height': 163, 'salary': 5200, 'dept': 3},
{'name': 'god', 'height': 140, 'salary': 2200, 'dept': 3},
{'name': 'alen', 'height': 130, 'salary': 8200, 'dept': 5},
{'name': 'bob', 'height': 180, 'salary': 7200, 'dept': 5}]
第2个返回(按工资和部门排序,先按工资,再按部门):
[{'name': 'joe', 'height': 170, 'salary': 2200, 'dept': 1},
{'name': 'x-man', 'height': 130, 'salary': 2200, 'dept': 2},
{'name': 'god', 'height': 140, 'salary': 2200, 'dept': 3},
{'name': 'chary', 'height': 163, 'salary': 5200, 'dept': 3},
{'name': 'bob', 'height': 180, 'salary': 7200, 'dept': 5},
{'name': 'alen', 'height': 130, 'salary': 8200, 'dept': 5}]