Python學習筆記 Sort與Sorted

2021-09-13 03:27:35 字數 3954 閱讀 9473

先舉例兩者用法:

>>

> l =[1

,3,2

,6,5

,4]>>

> l.sort(

)>>

> l[1

,2,3

,4,5

,6]>>

> l =[1

,3,2

,6,5

,4]>>

>

sorted

(l)[1,

2,3,

4,5,

6]>>

> l[1

,3,2

,6,5

,4]

上例可以看出,sort是list的屬性方法,得用l.sort()來呼叫,無需額外引數,無返回值,而且執行完之後l本身發生了變化(但記憶體位址沒有變化);而sorted並非是list的屬性,就是乙個普通的方法,需要傳入待排序的可迭代物件作為引數,重新生成並返回排序後的物件,原物件則保持不變。

額外注意:之所以區分這兩個函式,只是單純因為它們長得像,功能有點像(都可以實現),但它倆根本不是乙個層面上的東西。像「sort()不可以對dict物件進行排序」這種陳述壓根不用記,因為sort()是人家list自己的方法。

python2.x中的sort()接收cmp,key和reverse三個引數,但cmp這個引數有點雞肋,因為如果公升序排列,這個引數可以不要,如果倒序排列,reverse可以實現,如果需要更複雜的比較方式,key可以接收lambda函式來實現,所以python3中已經砍掉這個引數。

按照python3中的sort()來講,兩個引數講解如下:

>>

> l =[[

41,23]

,[15,

90],[

60,50]

]>>

> l.sort(

)>>

> l[[

15,90]

,[41,

23],[

60,50]

]#1>>

> l.sort(reverse=

true

)>>

> l[[

60,50]

,[41,

23],[

15,90]

]#2>>

> l.sort(key =

lambda x: x[0]

)>>

> l[[

15,90]

,[41,

23],[

60,50]

]#3>>

> l.sort(key =

lambda x: x[1]

)>>

> l[[

41,23]

,[60,

50],[

15,90]

]#4>>

> l =

['ben'

,'adam'

,'zelda'

]>>

> l.sort(

)>>

> l

['adam'

,'ben'

,'zelda']#5

>>

> l.sort(key =

lambda x: x[2]

)>>

> l

['adam'

,'zelda'

,'ben']#6

>>

> l =[[

93,95]

,[45,

34],[

54,3]

]>>

> l.sort(

)>>

> l[[

45,34]

,[54,

3],[

93,95]

]#7>>

> l =[[

[93,95

],[12

,44]]

,[[45

,34],

[44,90

]],[

[54,3

],[66

,12]]

]>>

> l.sort(

)>>

> l[[

[45,34

],[44

,90]]

,[[54

,3],

[66,12

]],[

[93,95

],[12

,44]]

]#8

1和2對比:reverse預設false,即公升序排列,指定為true後,就降序排列。

3和4對比:可以用key引數來比對特定的字元。

5和6對比:對於字串,預設比較首字元的ascii碼的大小。

7和8對比:如果有多層巢狀的list,預設比較最小單元的第乙個元素。即,如果有兩層就預設比較x[0][0],如果有3層,就預設比較x[0][0][0]。

也許你會想,如果乙個list中既有數字也有字串,那應該也會按照首字元的ascii碼來比較吧。錯了!

>>

> l =[95

,'a',40

]>>

> l.sort(

)traceback (most recent call last)

: file ""

, line 1,in

typeerror:

'<'

not supported between instances of 'str'

and'int'

a對應的ascii碼是65,但結果卻返回錯誤:小於號不可以用在比較字串和整型上。究其原因,是因為預設的cmp引數會依次從待比較的list中取出兩個要比較的元素,做減法逐個比較大小。而字元和數字之間不可以直接加減。那就把數字也轉換成string型別吧。

>>

> l =

['95'

,'a'

,'40'

]>>

> l.sort(

)>>

> l

['40'

,'95'

,'a'

]

奇怪了!a是65,怎麼會比95還大呢?

原因在於,這幾個元素都是字串,那就都按字元的ascii碼來比較。40的4對應的ascii是52,95的9對應的ascii是57,再加上a是65,這順序也就沒錯了。

附: ascii對照表

sorted()與sort()的引數都一樣,這裡只說不一樣的地方。由於sorted()可以對任何的可迭代物件進行排序,對dict排序的時候,預設是對key進行排序的,如果需要對value排序就傳key來實現。

>>

> s =

>>

>

sorted

(s)[1,

2]>>

>

sorted

(s,key =

lambda x: s[x])[

2,1]

因為dict作為乙個整體是無序集合,是無法排序的,所以也就不難理解為什麼排序後返回的只有包含key的list。

>>

> array =[,

,]>>

> array =

sorted

(array,key =

lambda x: x[

'age'])

>>

> array[,

,]>>

> array =[,

,]>>

> array.sort(

)traceback (most recent call last)

: file ""

, line 1,in

typeerror:

'<'

not supported between instances of 'dict'

and'dict'

Python學習筆記 sort 和 sorted

sort 與 sorted 區別 1 sort 是應用在list上的方法,sorted 可以對所有iterable進行排序操作。2 list 的 sort 方法返回的是對原來的列表進行操作,而內建函式 sorted 方法返回的是乙個新的 list,而不是在原來的基礎上進行的操作。list.sort ...

vector的sort使用 學習筆記

c 裡的容器有vector,list,map,pair等。最近在學習使用過程中,走了一些彎路,記錄一下。彎路1 map插入元素 如果定義了 mapm test 要插入乙個元素,不能直接m test.insert 1,1 得 m test.insert pair 1,1 或者使用m test.inse...

STL學習筆記之sort演算法

stl所提供的各式各樣的演算法中,sort 是最複雜龐大的乙個。這個演算法接受兩個隨機訪問迭代器,然後將區間內的所有元素以漸增方式由小到大重新排列。還有個版本則允許使用者指定乙個仿函式,作為排序標準。stl中的所有關係型容器都擁有自動排序功能,所以不需要sort演算法。序列式容器中的stack,de...