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