Python 排序詳解

2021-10-06 17:41:06 字數 3449 閱讀 9724

python中列表中有乙個內建方法sort()方法,可以直接對列表進行修改;還有乙個sorted()方法,它會從乙個可迭代物件構建乙個新的列表

基本排序

簡單的公升序非常簡單,只需呼叫sorted()方法,直接返回乙個新列表

li1 = [3, 1, 8, 39, 4, 89]

li2 = sorted(li1)

print(li2)

# 輸出:[1, 3, 4, 8, 39, 89]

也可以直接使用list.sort(),會直接修改列表

li1 = [3, 1, 8, 39, 4, 89]

li1.sort()

# li2 = sorted(li1)

print(li1)

還有乙個區別,list.sort()方法只是為列表定義的;而sorted()可以對所有可迭代物件進行排序,但只會返回乙個列表

key關鍵字

list.sort()和sorted()都有乙個形參key,來指定在進行比較之前要在每個列表元素呼叫的函式

li = sorted('this is a test string from wang'.split(), key=str.lower)

print(li)

# 輸出:['a', 'from', 'is', 'string', 'test', 'this', 'wang']

key形參的值應該是乙個函式,它接受乙個引數並返回乙個用於排序的鍵,這種技巧很快,因為對於每個輸入記錄只會呼叫一次key函式。

一種常見的操作是使用物件的一些索引作為鍵對複雜物件進行排序

student_tuple = [

('john', 's', '16'),

('tom', '2s', '20'),

('jemmy', 'sb', '18'),

('ming', 'ss', '13')

]print(sorted(student_tuple, key=lambda student: student[2]))

# 輸出:[('ming', 'ss', '13'), ('john', 's', '16'), ('jemmy', 'sb', '18'), ('tom', '2s', '20')]

字典排序

student_info = 

print(sorted(student_info.items(), key=lambda x: x[1][1])) # 按照字典值的第二個元素排序

# x相當於字典遍歷出來的乙個鍵值元祖

student_info = [,,

,]print(sorted(student_info, key=lambda key: key['age']))

同樣適用於具有命名屬性的物件

class student:

def __init__(self, name, grade, age):

self.name = name

self.grade = grade

self.age = age

def __repr__(self):

return repr((self.name, self.grade, self.age))

student_tuple = [

student('john', 'a', '14'),

student('tom', 'b', '20'),

student('jemmy', 'b+', '18'),

student('ming', 'b-', '16')

]print(sorted(student_tuple, key=lambda x:x.age))

# 輸出:[('john', 'a', '14'), ('ming', 'b-', '16'), ('jemmy', 'b+', '18'), ('tom', 'b', '20')]

operator模組函式

operator函式包含itemgetter()和attrgetter(),使用這些函式上述例子會更加簡單

from operator import itemgetter

student_tuple = [

('john', 's', '16'),

('tom', '2s', '20'),

('jemmy', 'sb', '18'),

('ming', 'ss', '13')

]print(sorted(student_tuple, key=itemgetter(2)))

student_tuple = [

student('john', 'a', '16'),

student('tom', 'b', '20'),

student('jemmy', 'b+', '18'),

student('ming', 'b-', '16')

]print(sorted(student_tuple, key=attrgetter('age')))

operator模組還允許多級排序,例如按照年齡排序,然後按照名字排序

from operator import itemgetter

student_tuple = [

('john', 's', '16'),

('tom', '2s', '20'),

('jemmy', 'sb', '18'),

('ming', 'ss', '16')

]print(sorted(student_tuple, key=itemgetter(2, 0)))

# 輸出:[('john', 's', '16'), ('ming', 'ss', '16'), ('jemmy', 'sb', '18'), ('tom', '2s', '20')]

公升序和降序

list.sort()和sorted()接受布林值reverse引數,用於標記公升序降序;reverse為true降序,false公升序

排序的穩定性和排序複雜度

排序穩定性指多個元素具有相同的鍵值時,將保留原來的順序

data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]

print(sorted(data, key=itemgetter(0)))

# 輸出:[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]

這樣就可以允許我們進行一系列排序步驟中構建複雜的排序,例如:要先按照age降序,然後在按照名字公升序

python氣泡排序詳解

要學習氣泡排序必須知道它的原理 氣泡排序演算法的原理如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒...

python 快速排序詳解

快速排序 基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。def quick sort li,start,end 分治 一分為二 start end 證明要處理的資料只有...

堆排序詳解 python實現

1 堆的定義 滿足以下情形的資料結構 情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 左 右子孩子的值比父結點的值都大 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 左 右子孩子的值比父結點的值都小 2 堆排序 一般從小到大的排序利用大頂堆實現。基本思想為 1 將初始待排序...