對字符串進行排序 以及 sort() 與sorted()


sort()函數與sorted()函數的區別

  sort()是List對象的方法

  sorted()只要是可迭代對象就可以,使用范圍比sort()函數更廣

List的sort()函數定義與用法:

Python源碼builtins.py文件對sort()函數的定義如下

    def sort(self, key=None, reverse=False):
        """ L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* """
        pass

可以看出:sort()函數沒有返回值,有兩個參數。key表示的是排依據的函數;reverse是指需不需要反轉列表,默認為False表示的是升序,如果設為True表示的是降序。

sort()用法如下

L = [1, 2, 7, 4, 3]
L.sort()
print(L)
#[1, 2, 3, 4, 7]

我們加入一些參數來看看,如降序排序:
L = [1, 2, 7, 4, 3]
L.sort(reverse=True)
print(L)
#[7, 4, 3, 2, 1]

通過key來實現降序排序,這里用到匿名函數lambda:

L = [1, 2, 7, 4, 3]
L.sort(key=lambda x : x*(-1))
print(L)
#[7, 4, 3, 2, 1]


將key設為內置函數或者自定義函數,比如用絕對值函數:

L = [-1, 2, -7, 4, 3]
L.sort(key=abs)
print(L)
#[-1, 2, 3, 4, -7]

Python3對key的還有另外一種支持,就是通過functools模塊的cmp_to_key函數,將傳統的cmp函數轉為key。這和lambda函數用法類似,但是對於比較的邏輯比較復雜的情況,這樣的方式會更清晰更便於維護。

from functools import cmp_to_key
L = [-1, 2, -7, 4, 3]
def cmp(a,b):
    if abs(a) < abs(b):
        return -1
    else:
        return 1
L.sort(key=cmp_to_key(cmp))
print(L)

二.sorted()

官方文檔

sorted(iterable,*,key = None,reverse = False )
從iterable中的項目返回一個新的排序列表。

有兩個可選參數,必須將其指定為關鍵字參數。

key指定一個參數的功能,該參數用於從iterable中的每個元素中提取一個比較鍵(例如key=str.lower)。默認值為None(直接比較元素)。

reverse是一個布爾值。如果設置為True,則對列表元素進行排序,就好像每個比較都被反轉一樣。

用functools.cmp_to_key()一個老式的轉換CMP功能的 關鍵功能。

內置sorted()功能保證穩定。如果可以保證不更改比較相等的元素的相對順序,則排序是穩定的-這有助於多次通過排序(例如,按部門排序,然后按薪級排序)。

sorted()返回值為List類型。參數列表iterable表示可迭代對象;*表示位置參數就此終結,后面的參數都必須用關鍵字來指定;key與reverse參數用法與sort()完全一致。

 

對字典進行value值排序(默認是通過key值排序)

Dict = {'a':2, 'b':3, 'c':7, 'd':4, 'e':1}
L = sorted(Dict.items(), key=lambda x : x[1])
print(L)
#[('e', 1), ('a', 2), ('b', 3), ('d', 4), ('c', 7)]

 

 

面試題:

對一個字符串進行統計,並且按照字符的數量依次排序

bbb='qqwwwwweredfdfhfgooooooooooo'
#對bbb列表里的子字符進行排序
L = sorted(bbb)

ll=[]
dic={}
count=0
for i in L:
    #每運行一次+1,統計運行次數
    count += 1
    #當ll列表內沒有值時
    if len(ll)==0:
        ll.append(i)
    #當i不再ll列表內時統計列表長度,並加入字典,然后清空,再將i加入列表
    elif i not in ll:
        dic[ll[0]]=len(ll)
        ll.clear()
        ll.append(i)
    #當i再列表內時,並且count小於列表總長度
    elif count<len(L):
        ll.append(i)
    #當i為列表內最后一個值
    elif i == L[-1] and count==len(L):
        ll.append(i)
        dic[ll[0]] = len(ll)

print(dic.items())
bbb=sorted(dic.items(),key=lambda x:x[1])
print(bbb)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM