operator
模块下有很多方法,这里主要介绍itemgetter
,该方法的解释为:
Return a callable object that fetches the given item(s) from its operand.
After f = itemgetter(2), the call f(r) returns r[2].
After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])
即该方法返回一个可调用对象,该对象从其操作的数据中获取给定项,如果选择了多项,返回这些项组成的元组,该对象是通过__getitem__
的方法,从被操作的数中获取item的。
在实际使用中可以认为返回的是一个函数,可以与filter()
、reduce()
结合使用。
使用时先导入模块
import operator
使用方法举例:
a = [1, "qwe", 3, 4]
# 定义b,获取从对象中获取下标为1和2的元素
b = operator.itemgetter(1, 2)
print(type(b)) # <class 'operator.itemgetter'>
print(b(a)) # ('qwe', 3)
print(type(b(a))) # <class 'tuple'>
与sorted()
函数结合使用
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
# 按照第三个数据进行比较,使用匿名函数lambda
c = sorted(students, key=lambda student: student[2])
print(c) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
# 使用operator.itemgetter
d = sorted(students, key=operator.itemgetter(2))
print(d) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
# 根据第二个元素排序,一样则根据第三个元素排序
e = sorted(students, key=operator.itemgetter(1, 2))
print(e) # [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
对字典进行排序
f = {1: 2, 3: 5, 2: 4, 0: 0, 7: 1, 5: 1, 6: 1}
# 使用匿名函数,只能根据某一个元素进行排序
g = sorted(f.items(), key=lambda x: x[1])
print(g) # [(0, 0), (7, 1), (5, 1), (6, 1), (1, 2), (2, 4), (3, 5)]
# 使用operator,操作数为1表示根据值排序,为0表示根据键排序,也可以一起用
h = sorted(f.items(), key=operator.itemgetter(1, 0))
print(h) # [(0, 0), (5, 1), (6, 1), (7, 1), (1, 2), (2, 4), (3, 5)]
对包含字典的列表进行排序
i = [{"name": "Homer", "age": 39}, {"name": "Bert", "age": 10}, {"name": "Tom", "age": 18}, {"name": "Bob", "age": 18}]
# 使用匿名函数,根据姓名进行排序
j = sorted(i, key=lambda x: x["name"])
print(j)
# 使用operator,根据姓名进行排序
k = sorted(i, key=operator.itemgetter("name"))
print(k)
# 根据年龄排序,年龄相同则根据姓名排序
l = sorted(i, key=operator.itemgetter("age", "name"))
print(l) # [{'name': 'Bert', 'age': 10}, {'name': 'Bob', 'age': 18}, {'name': 'Tom', 'age': 18}, {'name': 'Homer', 'age': 39}]