国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Python的列表排序

2019-11-14 17:41:01
字體:
來源:轉載
供稿:網友

Python的列表排序

本文為轉載,源地址為:http://blog.csdn.net/horin153/article/details/7076321

  在 Python 中, 當需要對一個 list 排序時, 一般可以用 list.sort() 或者 sorted(iterable[, cmp[, key[, reverse]]]).
其中:
cmp(e1, e2) 是帶兩個參數的比較函數, 返回值: 負數: e1 < e2, 0: e1 == e2, 正數: e1 > e2. 默認為 None, 即用內建的比較函數.
key 是帶一個參數的函數, 用來為每個元素提取比較值. 默認為 None, 即直接比較每個元素.
reverse 是一個布爾值, 表示是否反轉比較結果.

 我以前在做比較復雜的排序時, 喜歡寫一個定制的 cmp 函數. 當我看了 Python 文檔后, 發現我的做法是不好的. 簡單說明如下:

1, 通常, key 和 reverse 比 cmp 快很多, 因為對每個元素它們只處理一次; 而 cmp 會處理多次.
也就是說, 同等情況下, 寫 key 函數比寫 cmp 函數要高效很多.

2, 對一些貌似比較復雜的排序, 也是不需要寫 cmp 函數的, 舉例如下:
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]

用元素索引做 key:
>>> sorted(students, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

用元素已經命名的屬性做 key:
>>> sorted(students, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Operator 函數來加快速度, 上面兩個排序等價于:
>>> from operator import itemgetter, attrgetter
>>> sorted(students, key=itemgetter(2))
>>> sorted(students, key=attrgetter('age'))

用 operator 函數進行多級排序, 這個就是比較復雜的應用. 按我以前的理解, 是一定要寫個定制的 cmp 函數的. 現在看來, 以前真的夠笨.
# sort by grade then by age
>>> sorted(students, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> sorted(students, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

3, 根據字典值排序
>>> d = {'a':2, 'b':23, 'c':5, 'd':17, 'e':1}

#1, 返回 pair 對:
from operator import itemgetter
>>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)
[('b', 23), ('d', 17), ('c', 5), ('a', 2), ('e', 1)]

#2, 僅返回 keys:
>>> sorted(d, key=d.__getitem__, reverse=True)
['b', 'd', 'c', 'a', 'e']

4, sorted() 會返回一個新的已經排好序的 list.
list.sort() 是就地排序, 以節約空間, 當然就不會返回一個排好序的新的 list 了. 這對大的 list 排序是有空間優勢的.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深水埗区| 吴堡县| 松溪县| 莆田市| 丹棱县| 凌源市| 拜泉县| 朝阳区| 调兵山市| 嘉祥县| 夏津县| 苍溪县| 平果县| 家居| 罗山县| 壶关县| 丽水市| 鹿泉市| 大足县| 抚松县| 丹巴县| 顺义区| 收藏| 拜城县| 班玛县| 岫岩| 阿尔山市| 红原县| 定边县| 信阳市| 弋阳县| 五寨县| 邹城市| 三都| 内乡县| 黑山县| 奉节县| 开江县| 龙川县| 昭平县| 武平县|