python有兩個內置的函數用于實現排序,一個是list.sort()函數,一個是sorted()函數。
主要從事網頁設計、PC網站建設(電腦版網站建設)、wap網站建設(手機版網站建設)、成都響應式網站建設公司、程序開發、微網站、微信小程序定制開發等,憑借多年來在互聯網的打拼,我們在互聯網網站建設行業積累了豐富的網站設計、成都網站建設、網絡營銷經驗,集策劃、開發、設計、營銷、管理等多方位專業化運作于一體,具備承接不同規模與類型的建設項目的能力。
區別1:list.sort()函數只能處理list類型數據的排序;sorted()則可以處理多種類型數據的排序。
區別2:list.sort()會修改原來的list為排序后的結果;sorted()不會修改原來的數據,只是返回一個排序后的對象。
下面來動手寫點代碼進行測試:
list進行簡單的排序
1 a=['a','f','c','x','e']2 a.sort()3 a4 [a','c','e','f','x']
sorted()進行簡單排序
1 a=['a','f','c','x','e']2 a_new=sorted(a)3 a_new4 ['a', 'c', 'e', 'f', 'x']
list.sort()和sorted都有默認的參數reverse,該參數的默認值為“False”,即默認升序排列。如果要進行降序排列:
1 a=['a','f','c','x','e']2 a_new=sorted(a,reverse=True)3 a_new4 ['x', 'f', 'e', 'c', 'a']
對元組進行排列,不能使用list.sort()函數:
1 a=('a','f','c','x','e')2 a_new=a.sort()3
4 ttributeError: 'tuple' object has no attribute 'sort'
對字典的排序可以按照字典的key或者value進行排序:
1 dic={"aa":11,"ff":5,"ee":22}2 printsorted(dic.keys())3 ['aa', 'ee', 'ff']
從python2.4開始list.sort()和sorted()都引入了key參數來指定一個函數進行排序,有了key參數以后我們就可以對更加復雜的數據進行排序 。
假如需要排序的數據為一個list,但list的每一個元素都是一個字典,排序的方法如下:
dic=[{"name":"sunny","age":20},
{"name":"bell","age":5},
{"name":"jim","age":1},
{"name":"jan","age":10}]print sorted(dic,key=lambda arg:arg.get('age'),reverse=False) #按照每個字典的age的值進行排序,字典的方法dict.get(key)將返回指定鍵的值。
#輸出結果為:[{'age': 1, 'name': 'jim'}, {'age': 5, 'name': 'bell'}, {'age': 10, 'name': 'jan'}, {'age': 20, 'name': 'sunny'}]
print sorted(dic,key=lambda arg:arg.get('name'),reverse=False) #按照每個字典的name的值進行排序
#輸出結果為:[{'age': 5, 'name': 'bell'}, {'age': 10, 'name': 'jan'}, {'age': 1, 'name': 'jim'}, {'age': 20, 'name': 'sunny'}]
假如需要排序的數據為一個二維的list,即list的每一個元素也是一個list,方法與上面的例子類似:
a=[['100','8','30'],['200','5','50'],['300','1','20']]print sorted(a,key=lambda arg:arg[1]) #按照每個list的第1個元素進行排序
[['300', '1', '20'], ['200', '5', '50'], ['100', '8', '30']]
前面的2個例子中,key參數的值都是函數。在sorted函數中,key參數后面的函數的參數的數量只能是一個。lambda arg:arg.get('age')是一個lambda匿名函數,它是一個沒有函數名的單語句函數。冒號左邊是參數,冒號右邊的返回值,返回值將被用于排序。
python內置關于排序的工具主要有兩個一個是列表自帶的 sort() 方法,另外一個是 sorted() 函數。Python 列表內置方法可以直接修改列表。而 sorted() 內置函數從一個可迭代對象(列表,元組等都可以)構建一個新的排序列表。其函數原型分別如下:
對列表進行默認排序
從函數原型來看,可以看到兩者都具有兩個可選參數,它們都必須指定為關鍵字參數。
key 指定帶有單個參數的函數,用于從 iterable 的每個元素中提取用于比較的鍵 (例如 key=str.lower)。默認值為 None (直接比較元素)。 key 形參的值應該是個函數(或其他可調用對象),它接受一個參數并返回一個用于排序的鍵。
假設有其他類型的變量,比如一個自定義的類或者列表中又是一個列表。以官網例子為例有這樣一個列表,其元素為元組,
可以用以下方式按照年齡排序
類似的有自定義類
可以用如下方式進行排序
也可以顯示定義一個函數,且只有一個參數,返回用于排序的鍵,比如
總之就是定義一個函數返回一個用于排序的鍵,可以用lambda函數或者 def 定義都可以。
上面實現的簡單函數實際就是實現了返回一個有序結構的第 n 的元素,或者某個類中的某個屬性,因此 Python 提供了便利功能,使訪問器功能更容易,更快捷。operator 模塊有 itemgetter() 、 attrgetter() 函數。分別完成返回第 n 個元素,某個屬性功能。上面的排序可以用如下方式進行實現
在python2中,sort有一個 cmp 參數,即用一個函數來自定義比較,在python3中這種方式被取消。為了繼承類似的用法,在 Python 3.2 中, functools.cmp_to_key() 函數被添加到標準庫中的 functools 模塊中。
這種作用先定義如何比較兩個變量,以上面的學生列表按照年齡排序為例
這種做法自定義比較函數接收兩個形參,返回比較結果(bool),而新式方法接受一個參數,返回的是比較的鍵。
假設有字典 d = {'b':2, 'a':1,'c':8,'d':4} ,則可以通過以下方式對字典按照鍵和值進行排序
#encoding=utf-8
import?random
from?copy?import?copy
def?directInsertSort(seq):
"""?直接插入排序?"""
size?=?len(seq)
for?i?in?range(1,size):
tmp,?j?=?seq[i],?i
while?j??0?and?tmp??seq[j-1]:
seq[j],?j?=?seq[j-1],?j-1
seq[j]?=?tmp
return?seq
def?directSelectSort(seq):
"""?直接選擇排序?"""
size?=?len(seq)
for?i?in?range(0,size?-?1):
k?=?i;j?=?i+1
while?j??size:
if?seq[j]??seq[k]:
k?=?j
j?+=?1
seq[i],seq[k]?=?seq[k],seq[i]
return?seq
def?bubbleSort(seq):
"""冒泡排序"""
size?=?len(seq)
for?i?in?range(1,size):
for?j?in?range(0,size-i):
if?seq[j+1]??seq[j]:
seq[j+1],seq[j]?=?seq[j],seq[j+1]
return?seq
def?_divide(seq,?low,?high):
"""快速排序劃分函數"""
tmp?=?seq[low]
while?low?!=?high:
while?low??high?and?seq[high]?=?tmp:?high?-=?1
if?low??high:
seq[low]?=?seq[high]
low?+=?1
while?low??high?and?seq[low]?=?tmp:?low?+=?1
if?low??high:
seq[high]?=?seq[low]
high?-=?1
seq[low]?=?tmp
return?low
def?_quickSort(seq,?low,?high):
"""快速排序輔助函數"""
if?low?=?high:?return
mid?=?_divide(seq,?low,?high)
_quickSort(seq,?low,?mid?-?1)
_quickSort(seq,?mid?+?1,?high)
def?quickSort(seq):
"""快速排序包裹函數"""
size?=?len(seq)
_quickSort(seq,?0,?size?-?1)
return?seq
def?merge(seq,?left,?mid,?right):
tmp?=?[]
i,?j?=?left,?mid
while?i??mid?and?j?=?right:
if?seq[i]??seq[j]:
tmp.append(seq[i])
i?+=?1
else:
tmp.append(seq[j])
j?+=?1
if?i??mid:?tmp.extend(seq[i:])
if?j?=?right:?tmp.extend(seq[j:])
seq[left:right+1]?=?tmp[0:right-left+1]
def?_mergeSort(seq,?left,?right):
if?left?==?right:?
return
else:
mid?=?(left?+?right)?/?2
_mergeSort(seq,?left,?mid)
_mergeSort(seq,?mid?+?1,?right)
merge(seq,?left,?mid+1,?right)
#二路并歸排序
def?mergeSort(seq):
size?=?len(seq)
_mergeSort(seq,?0,?size?-?1)
return?seq
if?__name__?==?'__main__':
s?=?[random.randint(0,100)?for?i?in?range(0,20)]
print?s
print?"\n"
print?directSelectSort(copy(s))
print?directInsertSort(copy(s))
print?bubbleSort(copy(s))
print?quickSort(copy(s))
print?mergeSort(copy(s))
排序是計算機程序設計中的一種重要操作,它的功能是將一個數據元素的任意序列,重新排列成一個關鍵字有序的序列。那么python列表排序算法有哪些?本文主要為大家講述python中經常用的三種排序算法:冒泡排序、插入排序和選擇排序。
1、冒泡排序
冒泡排序,Bubble
Sort,是一種簡單的排序算法。它重復地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢浮到數列的頂端。
2、插入排序
插入排序,Insertion
Sort,是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。插入排序在實現上,在從后向前的掃描過程中,需要把已排序元素逐步向后挪位,為最新元素提供插入空間。
3、選擇排序
選擇排序,Selection
Sort,是一種簡單直觀的排序算法。它的工作原理如下:首先在未排序序列中找到最小、最大元素,存放到排序序列的起始位置,然后再從剩余未排序元素中繼續尋找最小、最大元素。放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
本文名稱:排序算法函數python,幾種常見排序算法
網頁網址:http://m.kartarina.com/article24/heihje.html
成都網站建設公司_創新互聯,為您提供企業網站制作、外貿網站建設、小程序開發、做網站、微信小程序、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯