16、Python内置函数--sorted及itemgetter

3、sorted

Python内置的sorted()函数就可以对list进行排序。

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。对比原始的list和经过key=abs处理过的list:

list = [36, 5, -12, 9, -21]
keys = [36, 5,  12, 9,  21]

然后sorted()函数按照keys进行排序,并按照对应关系返回list相应的元素:

keys排序结果 => [5, 9,  12,  21, 36]
                |  |    |    |   |
最终结果     => [5, 9, -12, -21, 36]

例1:用一组tuple表示学生名字和成绩,分别按名字排序;再按成绩从高到低排序。

def by_name(t):
    return t[0]

#by_score和by_score2都是对分数进行由高到低排序
def by_score(t):
    return -t[1]      #对分数取负

def by_score2(t):
    return t[1]          #取分数,然后调用时使得reverse=True

students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

#注意:key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
print(sorted(students,key=by_name))
print(sorted(students,key=by_score))
print(sorted(students,key=by_score2,reverse=True))

输出结果:
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]

itemgetter

通过使用operator 模块的itemgetter 函数,可以非常容易的排序这样的数据结构

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}]

print(sorted(rows,key=itemgetter('fname')))   #按fname进行排序
print(sorted(rows,key=itemgetter('uid')))     #按uid进行排序

输出结果:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}, 
 {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, 
 {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
 {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]

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

例1类似可直接写成:

from operator import itemgetter
students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

print(sorted(students,key=itemgetter(1),reverse=True))  #按分数降序排序

输出结果:
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
发布了70 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/LOVEYSUXIN/article/details/103187807