Python中的sorted函数以及operator.itemgetter函数

operator.itemgetter函数

operator模块提供了itemgetter()函数,可以通过指定该函数的参数(参数代表维度)来获取对象的相应维度的数据,可以通过一个例子看一下:

from operator import itemgetter

direction = ['west', 'south', 'north', 'east']
desc1 = itemgetter(2)    # 获取第2维
print(desc1(direction))
desc2 = itemgetter(3, 0) # 获取第3维和第0维
print(desc2(direction))

输出:
north
(‘east’, ‘west’)

注意:itemgetter()函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。operator.itemgetter() 函数的参数可以是一个字典键名称,一个整型值等。如果你传入多个索引参数给 itemgetter() ,它生成的 callable 对象会返回一个包含所有元素值的元组,并且 sorted() 函数会根据这个元组中元素顺序去排序

sorted函数

Python内置的排序函数sorted可以对list或者iterator进行排序,函数原型如下:
sorted(iterable[, key][, reverse])

(1)iterable指定要排序的list或者iterable
(2)key为函数,指定取待排序元素的哪一项进行排序
(3)reverse是一个bool变量,表示升序还是降序排列,默认为False(升序排列),定义为True时将按降序排列

下面通过几个例子说明:

from operator import itemgetter

staff = [('Russell', 'Machine Learning', 28), ('Tom', 'Website Architect', 35), ('Liang', 'Data Analyst', 25)]
s = sorted(staff, key=itemgetter(1))
print(s)

输出结果:
[(‘Liang’, ‘Data Analyst’, 25), (‘Russell’, ‘Machine Learning’, 28), (‘Tom’, ‘Website Architect’, 35)]
可以看到,最终会以每个员工的职位这一列(第1列)进行升序排序

key函数也可以是使用lambda表达式来表示:
下面我们改写上面代码,通过年龄(第2列)进行降序排序:

from operator import itemgetter

staff = [('Russell', 'Machine Learning', 28), ('Tom', 'Website architect', 35), ('Liang', 'Data Analyst', 25)]
s = sorted(staff, key=lambda s : s[2], reverse=True)
print(s)

输出结果:
[(‘Tom’, ‘Website architect’, 35), (‘Russell’, ‘Machine Learning’, 28), (‘Liang’, ‘Data Analyst’, 25)]

再看一个例子,假如你通过访问数据库获得下面一张有关成员信息的表单:
rows = [
{‘fname’: ‘Brian’, ‘lname’: ‘Jones’, ‘uid’: 1003},
{‘fname’: ‘David’, ‘lname’: ‘Beazley’, ‘uid’: 1002},
{‘fname’: ‘John’, ‘lname’: ‘Cleese’, ‘uid’: 1001},
{‘fname’: ‘Big’, ‘lname’: ‘Jones’, ‘uid’: 1004}
]
表单是由相关成员组成的列表,每个成员用一个字典来存储其相关信息。我们可以通过每个字典的key值对列表进行排序:

from operator import itemgetter

rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]

rows_by_fname = sorted(rows, key=itemgetter('fname'))
rows_by_uid = sorted(rows, key=itemgetter('uid'))
rows_by_lfname = sorted(rows, key=itemgetter('lname', 'fname')) 
rows_by_fname2 = sorted(rows, key=lambda r: r['fname'])

print(rows_by_fname)
print()
print(rows_by_uid)
print()
print(rows_by_lfname)
print()
print(rows_by_fname2)

输出结果:
rows_by_fname:
[{‘fname’: ‘Big’, ‘lname’: ‘Jones’, ‘uid’: 1004}, {‘fname’: ‘Brian’, ‘lname’: ‘Jones’, ‘uid’: 1003}, {‘fname’: ‘David’, ‘lname’: ‘Beazley’, ‘uid’: 1002}, {‘fname’: ‘John’, ‘lname’: ‘Cleese’, ‘uid’: 1001}]
rows_by_uid:
[{‘fname’: ‘John’, ‘lname’: ‘Cleese’, ‘uid’: 1001}, {‘fname’: ‘David’, ‘lname’: ‘Beazley’, ‘uid’: 1002}, {‘fname’: ‘Brian’, ‘lname’: ‘Jones’, ‘uid’: 1003}, {‘fname’: ‘Big’, ‘lname’: ‘Jones’, ‘uid’: 1004}]
rows_by_lfname:
[{‘fname’: ‘David’, ‘lname’: ‘Beazley’, ‘uid’: 1002}, {‘fname’: ‘John’, ‘lname’: ‘Cleese’, ‘uid’: 1001}, {‘fname’: ‘Big’, ‘lname’: ‘Jones’, ‘uid’: 1004}, {‘fname’: ‘Brian’, ‘lname’: ‘Jones’, ‘uid’: 1003}]
rows_by_fname2:
[{‘fname’: ‘Big’, ‘lname’: ‘Jones’, ‘uid’: 1004}, {‘fname’: ‘Brian’, ‘lname’: ‘Jones’, ‘uid’: 1003}, {‘fname’: ‘David’, ‘lname’: ‘Beazley’, ‘uid’: 1002}, {‘fname’: ‘John’, ‘lname’: ‘Cleese’, ‘uid’: 1001}]

最后需要提醒的是,上面展示的技术也同样适用于 min() 和 max() 等函数

min(rows, key=itemgetter('uid'))
max(rows, key=lambda s : s['uid'])

输出:
{‘fname’: ‘John’, ‘lname’: ‘Cleese’, ‘uid’: 1001}
{‘fname’: ‘Big’, ‘lname’: ‘Jones’, ‘uid’: 1004}

猜你喜欢

转载自blog.csdn.net/qq_30982323/article/details/81985882