流暢的Python list排序和保持有序序列

2022-08-13 00:15:28 字數 3373 閱讀 5617

不管是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 bisect

import 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列表為例吧。因為每個元素的...