先舉例兩者用法:
>>
> 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...