Python中sort sorted高階排序技巧

2021-07-27 08:35:38 字數 3134 閱讀 7214

在python中對list進行排序有兩種方法:

1.用list的成員函式sort進行排序

2.用built-in函式sorted進行排序

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

sort說明

help(list.sort)

help on method_descriptor:

sort(…)

l.sort(cmp=none, key=none, reverse=false) – stable sort in place;

cmp(x, y) -> -1, 0, 1

sorted說明

help(sorted)

help on built-in function sorted in modulebuiltin:

sorted(…)

sorted(iterable, cmp=none, key=none, reverse=false) –> new sorted list

iterable:是可迭代型別;

cmp:用於比較的函式,比較什麼由key決定,有預設值,迭代集合中的一項;

key:用列表元素的某個屬性和函式進行作為關鍵字,有預設值,迭代集合中的一項;

reverse:排序規則. reverse = true 或者 reverse = false,有預設值。

注;一般來說,cmp和key可以使用lambda表示式。

sort()與sorted()的不同在於,sort是在原位重新排列列表,而sorted()是產生乙個新的列表。

sorting basic:

>>>

print sorted([5, 2, 3, 1, 4])

[1, 2, 3, 4, 5]

>>> l = [5, 2, 3, 1, 4]

>>> l.sort()

>>>

print l

[1, 2, 3, 4, 5]

sorting cmp:

>>>l = [('b',2),('a',1),('c',3),('d',4)]

>>>print sorted(l, cmp=lambda x,y:cmp(x[1],y[1]))

[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

sorting keys:

>>>l = [('b',2),('a',1),('c',3),('d',4)]

>>>print sorted(l, key=lambda x:x[1]))

[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

sorting reverse:

>>>

print sorted([5, 2, 3, 1, 4], reverse=true)

[5, 4, 3, 2, 1]

>>>

print sorted([5, 2, 3, 1, 4], reverse=false)

[1, 2, 3, 4, 5]

注:效率key>cmp(key比cmp快)

在sorting keys中:我們看到,此時排序過的l是僅僅按照第二個關鍵字來排的,如果我們想用第二個關鍵字

排過序後再用第乙個關鍵字進行排序呢?

l = [(『d』,2),(『a』,4),(『b』,3),(『c』,2)]

print sorted(l, key=lambda x:(x[1],x[0]))

[(『c』, 2), (『d』, 2), (『b』, 3), (『a』, 4)]

>>>d=

>>>sorted(d.keys())

['a', 'b', 'c']

>>>

直接使用sorted(d.keys())就能按key值對字典排序,這裡是按照順序對key值排序的,如果想按照倒序排序的話,則只要將reverse置為true即可。

要對字典的value排序則需要用到key引數,在這裡主要提供一種使用lambda表示式的方法,如下:

>>>d=

>>>sorted(d.items(),key=lambda item:item[1])

這裡的d.items()實際上是將d轉換為可迭代物件,迭代物件的元素為[(『a』, 3), (『c』, 1), (『b』, 2)],items()方法將字典的元素轉化為了元組,而這裡key引數對應的lambda表示式的意思則是選取元組中的第二個元素作為比較引數(如果寫作key=lambda item:item[0]的話則是選取第乙個元素作為比較物件,也就是key值作為比較物件。lambda x:y中x表示輸出引數,y表示lambda函式的返回值),所以採用這種方法可以對字典的value進行排序。注意排序後的返回值是乙個list,而原字典中的名值對被轉換為了list中的元組。

設有n個正整數,將他們連線成一排,組成乙個最大的多位整數.

例如:3個整數13,312,343,連成的最大整數為:34331213

又如:4個整數7,13,4,246連線成的最大整數為7424613

現在給你乙個正整數列表l,請你輸出用這些正整數能夠拼接成的最大整數。

note:測試資料已於2023年11月13日更新,以前通過的**不一定能夠再次通過。

運用sorted**如下:

maxlen = len(str(max(l)))

b = [ for x in l]

#print b

tmpret = [value["old"] for value in sorted(b,key=lambda s:s["new"],reverse=true)]

print(''.join(tmpret))

輸出結果:

b= [, , , ]

7424613

b中包含了多個字典,如何對每個字典中的『new』進行排序呢?

參考**:

特別推薦:

python中 python中的 與

這一部分首先要理解python記憶體機制,python中萬物皆物件。對於不可變物件,改變了原來的值,其別名 變數名 繫結到了新值上面,id肯定會改變 對於可變物件,操作改變了值,id肯定會變,而 是本地操作,其值原地修改 對於 號操作,可變物件和不可變物件呼叫的都是 add 操作 對於 號操作,可變...

python中否定for 在python中否定函式

有沒有一種方法可以否定乙個函式,使它返回負數。在我的函式中,我有條件句,每個條件句都讓這個 烏龜 移動。有沒有一種方法可以否定這一點,所以烏龜的每乙個動作都是否定的。我說的是 狀況 在def ttinterpret program interpret program as a tinyturtle ...

python中雙重迴圈 加速Python中的雙迴圈

有沒有辦法加快從上一次迭代更新其值的雙迴圈?在 中 def calc n,m x 1.0 y 2.0 container np.zeros n,2 for i in range n for j in range m x np.random.gamma 3,1.0 y y 4 y np.random....