Python必懂知識點:sort()和sorted()如何選擇

都說加上ed就是過去時,如果可以,我想插上ed的翅膀,回到過去,看著那個曾經的自己,似曾相識,恍如隔日,如夢如幻,如泡如影,如露如電,如果不知道sort()和sorted()就往下看。

Python必懂知識點:sort()和sorted()如何選擇

(1)使用範圍不一樣

只有當對象是列表時,才能調用sort()方法,而sorted()是全局函數,可作用於所有可迭代對象。

(2)返回結果不一樣

因為sort()是列表的自帶方法,所以當列表調用此方法時,會改變自身的值,且返回值為None。而sorted()不會改變原有對象的值,會返回一個新對象。

結合以上兩點,來看具體例子:

<code># 列表可以調用sort()方法,並會改變自身的值,返回值為None
a = [1, 5, 7, 3, 4]
a.sort()
print(a) # [1, 3, 4, 5, 7]
b = a.sort()
print(b) # None

# 元組不支持sort()方法
c = (1, 5, 7, 3, 4)
c.sort()
print(c) # AttributeError: 'tuple' object has no attribute 'sort'

# sorted()函數可以作用於元組,並不改變原有元組的值,且返回排完序後的新列表
c = (1, 5, 7, 3, 4)

d = sorted(c)
print(c) # (1, 5, 7, 3, 4)
print(d) # [1, 3, 4, 5, 7]
/<code>

所以當我們需要保留原有的列表時,那就應該使用sorted()函數,否則就用列表自身的sort()方法,因為sort()方法不需要複製原有的列表,會消耗較少內存。

(3)key參數的使用

sort()和sorted()都有一個key參數,且用法相同,該參數是一個函數,在每個元素被比較前調用,只接受一個值並返回一個用於比較的值。

以下是調用列表的sort()方法,key作用是根據每個元素的索引為2的值進行比較。

<code>list_data = [('老王', '北京', 36),
('老李', '上海', 42),
('老張', '廣州', 26)]
list_data.sort(key=lambda x: x[2])
print(list_data) # [('老張', '廣州', 26), ('老王', '北京', 36), ('老李', '上海', 42)]
/<code>

以下是使用sorted()對字典進行排序(根據value值大小)

<code>dict_data = {'apple': 15, 'orange': 12, 'banana': 17}
result = sorted(dict_data, key=lambda x: x[1])
print(result) # ['banana', 'apple', 'orange']/<code>

可以看到這並不是我們想要的結果,其原因是沒有加.items()

,這樣只是給字典中的key值排序,即對apple、orange、banana三者排序。

又因為參數key規定根據索引為1的值進行排序,也就是比較三個單詞中的第二位字母,即p、r、a。

而在比較字母時,所比較的是字母對應的Ascii值,字母順序越靠前,其值越小。因此結果為banana、apple、orange。

要想根據value值大小對字典排序,需要加上.items()

<code>dict_data = {'apple': 15, 'orange': 12, 'banana': 17}
result = sorted(dict_data.items(), key=lambda x: x[1])
print(result) # [('orange', 12), ('apple', 15), ('banana', 17)]/<code>

加上.items()後,其實就是對('apple', 15)、(‘orange’, 12)、('banana', 17)這三個元素進行排序,然後通過參數key規定根據索引為1的值進行排序,也就是根據value值排序。

另外,不論是sort()還是sorted()都是默認升序排列,也就是reverse參數默認值為False,如果想降序排列,則需將reverse設置為True即可。


關注微信公眾號“Python小鎮”,發現更多幹貨知識!


分享到:


相關文章: