歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python中sort以及sorted函數初探

Python中sort以及sorted函數初探:

sorted(...)
Help on built-in function sorted in module __builtin__:

sorted(...)

    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

sort(...)
Help on built-in function sort:
sort(...)
    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
    cmp(x, y) -> -1, 0, 1

sorted與sort的區別
1. sorted函數是內建函數,而sort是序列的內部函數,所以它們調用方式不一樣,另外sorted函數多了一個系列迭代器參數

2. sorted函數不改變參數系列,但是返回排好序的序列副本;而sort作為序列的內部函數,調用完後會對調用的序列進行排序

下面的結果很好的說明了這些:

>>> list=[2,1]
>>> x=sorted(list)
>>> x
[1, 2]
>>> list
[2, 1]
>>> y=list.sort()
>>> y
>>> list
[1, 2]

sorted與sort的參數
sorted與sort除了一個是序列作為參數,一個是序列調用該函數,其他參數幾乎完全一致,下面逐一來介紹其用法及效果:

1. 默認用法
由於sort函數的參數reverse,key,cmp都提供了缺省參數,所以我們可以直接不指定這些參數值調用該函數。但是它必須有一個前提,就是list中存放的類型是可比較的。否則就會彈出錯誤“Type Error: unorderable type"。

2. reverse參數
當取值為True時候就是倒序排,默認為False正序從小到大排

>>> list.sort(reverse=False)
>>> list
[1, 2]
>>> list.sort(reverse=True)
>>> list
[2, 1]

3. key參數
key表示用來做比較的值,這個主要對自定義的數據類型有用。下面用一個例子來诠釋:

# Definition for an interval.
class Interval:
 def __init__(self, s=0, e=0):
  self.start = s
  self.end = e

# Initialize the Interval list
list = []
for i in range(10,7,-1):
 for j in range(11,i,-1):
  list.append(Interval(i,j))

這裡我們定義了Interval為[s,e]的數據結構並且初始化了。對於這個問題,顯然我們用缺省的參數來調用會出錯,因為我們沒有提供可比較的函數來比較類型Interval。對於這樣的情況,我們就可以指定比較的key來解決。

#Sort the Interval list
list2 = sorted(list,key=lambda x:x.start)

#Output the Interval list
for x in list:
 print("[%d,%d]"%(x.start,x.end))
for x in list2:
 print("[%d,%d]"%(x.start,x.end))

這裡我們基於Interval.start作為key進行排序了。

可是接著問題來了,如果我不僅比較Interval.start,當Interval.start相等時候,還想比較Interval.end,該怎麼辦?

#Sort the Interval list based on Interval.start and Interval.end
list2 = sorted(list,key=lambda x:(x.start,x.end))

我們用元祖(Interval.start,Interval.end)作為key來比較,而元祖有默認的cmp函數。這就達到了目標。

4. cmp參數
我們可以通過自定義函數或則使用簡潔的lambda來作為參數傳給cmp

#Sort the Interval list based on Interval.start and Interval.end
def cmpInterval(a, b):
 if a.start != b.start:
  return cmp(a.start,b.start)
 return cmp(a.end,b.end)
list1 = sorted(list,cmp = cmpInterval)
list2 = sorted(list,cmp = lambda x,y:cmp(x.start,y.start))

不過比較遺憾的是發現在python 3.x中傳入cmp函數會出現一個錯誤:TypeError: 'cmp' is an invalid keyword argument for this function
這時候我們就需要使用key來繞過這個問題。另外一個建議就是我們盡量使用key而不是cmp來排序以提高運行速度。

Python向PHP發起GET與POST請求 http://www.linuxidc.com/Linux/2014-10/107903.htm

《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm

Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved