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