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)]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章