不管是list.sort還是sorted函式,list.sort會就地排序列表,不會把列表複製乙份,sorted會產生新的物件,有兩個可選關鍵引數:reverse 和 key。
reverse:ture為降序。預設為false,為公升序。
key: 排序演算法依賴的對比關鍵字。比如:key=str.lower 實現忽略大小寫的排序 , key=len 實現字串長度的排序,預設的是恒等函式,也就是預設使用元素的值排序。
# 水果list# 獲取物件記憶體位址
print(id(fruits))
# 使用list.sort預設排序
fruits.sort()
# 檢視效果
print(fruits)
# 使用內建sorted函式預設排序
print(sorted(fruits))
# 獲取物件記憶體位址
print(id(fruits))
# 獲取物件記憶體位址
print(id(sorted(fruits)))
# 結果
# 1597512311304
# 1597512311304
# 1597512311368
list.sort(key= ,reverse = ) 與sorted(list, key = , reverse = )等可選引數的排序,可自行嘗試結果。
bisect是乙個模組,這個模組中主要包括兩個函式:bisect 和 insort 。這兩個函式都是使用二分查詢演算法對有序序列中查詢或插入元素。
注意:必須是已經排好序的有序序列。
模組bisect中bisect函式:bisect(有序序列l,想搜尋的值x),返回x可以插入l中的index,(所以說,如果是公升序的情況下,返回的index前邊的值都是小於或等於x的值),index是有序序列中的索引。
找到index後再使用l.insert(index,想搜尋的值x)插入新值x。
我們也可以使用模組bisect中insort函式一步到位。
# 引入bisect模組import bisect
# import sys
# 製作一有序序列 haystack
haystack = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
# 想要插入haystack中的值
needles = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
# 列印輸出,format用法 ,2d補足寬度為2
row_fmt = ' @ '
# 寫乙個demo函式列印效果
def demo(bisect_fn):
# 將需要插入的數 乙個乙個的遍歷
for needle in reversed(needles):
# 返回可插入的位置
position = bisect_fn(haystack, needle)
# 位置數從1開始,所以列印將前方的數都置為 |
offset = position * ' |'
# 填充資料
print(row_fmt.format(needle, position, offset))
if __name__ == '__main__':
bisect_fn = bisect.bisect
print('demo:', bisect_fn.__name__)
print('haystack ->', ' '.join('%2d' % n for n in haystack))
demo(bisect_fn)
# 結果
# demo: bisect_right
# haystack -> 1 4 5 6 8 12 15 20 21 23 23 26 29 30
# 31 @ 14 | | | | | | | | | | | | | |31
# 30 @ 14 | | | | | | | | | | | | | |30
# 29 @ 13 | | | | | | | | | | | | |29
# 23 @ 11 | | | | | | | | | | |23
# 22 @ 9 | | | | | | | | |22
# 10 @ 5 | | | | |10
# 8 @ 5 | | | | |8
# 5 @ 3 | | |5
# 2 @ 1 |2
# 1 @ 1 |1
# 0 @ 0 0
可通過bisect中兩個可選引數:lo和hi 縮小收縮範圍
這種使用方式在很多地方都使用的上,例如:乙個人的各科成績要轉換成對應的 成績 等級,4行**解決問題
def grade(score,breakpoints=[60, 70, 80, 90],grades='fdcba'):i = bisect.bisect(breakpoints, score)
return grades[i]
print([grade(score) for score in [33, 99 ,77 ,70 , 89, 90, 100]])
# 結果
# ['f', 'a', 'c', 'c', 'b', 'a', 'a']
用bisect.insort插入新元素
import bisectimport random
size = 7
# seed改變隨機數生成器的種子,使每次結果相同
random.seed(1729)
my_list =
for i in range(size):
# 0到size*2選取乙個隨機數
new_item = random.randrange(size*2)
bisect.insort(my_list, new_item)
print('%2d ->' % new_item,my_list)
# 結果
# 10 -> [10]
# 0 -> [0, 10]
# 6 -> [0, 6, 10]
# 8 -> [0, 6, 8, 10]
# 7 -> [0, 6, 7, 8, 10]
# 2 -> [0, 2, 6, 7, 8, 10]
# 10 -> [0, 2, 6, 7, 8, 10, 10]
python list多級排序
在python3的sorted中去掉了cmp引數,轉而推薦 key lambda 的方式來排序。如果需要對python的list進行多級排序。有如下的資料 list num 12,3 18,34 18,10 12,45 18,10 8,34 需要從小到大的排序。先比較第乙個數,如果第乙個數相等的話比...
python list 自定義排序
看到的乙個知識點,稍加記錄 a 希望將上述的list排序,按照每條記錄中的 score 排序。如果 score 欄位的值相等,則按照 first 的值排序。如果 first 依舊相等,則按照 second 排序。如果 second 相等,則按照 third 欄位的值來排序。a.sort.doc l....
python list 對時間排序小結。
python list 排序比較簡單。但是對時間排序有時可能會比較麻煩一點,對時間的大致思想是對時間字串進行格式化。然後進行排序。第一種排序方法是按照 的方法進行排序。第二種排序方法比較簡單,但是對時間格式要求比較嚴格。就拿第一種方法中部落格鏈結裡面的result data列表為例吧。因為每個元素的...