python列表排序用?sort()和sorted()的區(qū)別
前言:
內(nèi)容提要:本文比較了 Python 中用于列表排序的兩種函數(shù) sort() 和 sorted(),幫助您選擇合適的排序函數(shù)。
對(duì)列表排序時(shí),既可以用 List.sort(),也可以用 sorted(List),這兩個(gè)函數(shù)有什么不同呢?如何選擇?我以前常常分不清這兩個(gè)函數(shù),等到程序報(bào)錯(cuò)了,才知道 sorted 寫成 sort 了,List 不能寫在 sort() 括號(hào)里。您是否也有這個(gè)困惑呢?那就一起通過例子來熟悉這兩個(gè)函數(shù)吧,以后就知道應(yīng)該怎么使用了。
1. 是否改變?cè)斜?/h2>
首先應(yīng)用 List.sort()
對(duì)列表排序,
代碼示例如下:
letters=['a','dc','ab','D'] print('before sort: letters:',letters) result1=letters.sort() print('after sort: result1:',result1) print('after sort: letters:',letters)
運(yùn)行結(jié)果為:
before sort: letters: ['a', 'dc', 'ab', 'D']
after sort: result1: None
after sort: letters: ['D', 'a', 'ab', 'dc']
可以看到,List.sort()
沒有返回值,而是直接改變了原列表。這既是優(yōu)點(diǎn)也是缺點(diǎn)。說它是優(yōu)點(diǎn)呢,有時(shí)不需要再使用原列表,直接修改原列表可以節(jié)約內(nèi)存空間,尤其當(dāng)這個(gè)列表很大時(shí)。而它的缺點(diǎn)也正是因?yàn)楦牧嗽斜恚率衷诔绦蛟O(shè)計(jì)時(shí)容易忽視這一點(diǎn),在后續(xù)程序中錯(cuò)誤地操作列表,導(dǎo)致得不到預(yù)計(jì)的結(jié)果。
再來看一下應(yīng)用 sorted(List)
對(duì)列表排序的效果,
代碼示例如下:
letters=['a','dc','ab','D'] print('before sorted: letters:',letters) result2=sorted(letters) print('after sorted: result2:',result2) print('after sorted: letters:',letters)
運(yùn)行結(jié)果為:
before sorted: letters: ['a', 'dc', 'ab', 'D']
after sorted: result2: ['D', 'a', 'ab', 'dc']
after sorted: letters: ['a', 'dc', 'ab', 'D']
可以看到,sorted(List)
返回一個(gè)排序好的新列表,原列表不變。
依據(jù)上述對(duì)比,在選擇排序函數(shù)時(shí),我們需要考慮兩點(diǎn):
- 1.是否希望改變?cè)斜?,如果是,選擇 sort()。如果原列表不能修改,選擇 sorted()。
- 2.注意使用函數(shù)的返回值,或者說排序好的列表存在哪里。比如代碼為 list2=list1.sort() 或者 function(list1.sort()),那么 list2 其實(shí)是 None,而不是排序好的列表。同理,
function()
函數(shù)的輸入也是 None。list1 才是排序好的列表。
2.參數(shù)設(shè)置:key 和 reverse
看上面例子中列表 letters
的排序結(jié)果,發(fā)現(xiàn) D 居然排在 a 的前面?這是因?yàn)?ASCII 碼中大寫英文字母排在小寫英文字母的前面。那么,如果我們想實(shí)現(xiàn)按字母順序,不區(qū)分大小寫的排序,應(yīng)該怎么辦呢?
方法:可以設(shè)置 key 參數(shù),對(duì) sort() 和 sorted() 都適用。
比如:設(shè)置key=str.lower
,就是按字符的小寫字母形式排序。
代碼示例如下:
letters=['a','dc','ab','D'] letters.sort(key=str.lower) print(letters)
運(yùn)行結(jié)果為:
['a', 'ab', 'D', 'dc']
此外,默認(rèn)是按升序排列。也可以設(shè)置reverse=True,
就是按降序排列。這一參數(shù)同樣是對(duì) sort() 和 sorted() 都適用。下面的代碼示例同時(shí)設(shè)置了 key 和 reverse 參數(shù)。
letters=['a','dc','ab','D'] result=sorted(letters,key=str.lower,reverse=True) print(result)
運(yùn)行結(jié)果為:
['dc', 'D', 'ab', 'a']
3.輸入數(shù)據(jù)類型
List.sort()
是列表對(duì)象(object
)的一個(gè)方法(method
),因此只能用于列表。
而sorted()
函數(shù)是 Python 語言的內(nèi)置函數(shù),可以用于 iterables,包括 列表(List),元組(Tuple),字典(Dict)等等。iterable 對(duì)象有一個(gè)特點(diǎn),就是可以用在循環(huán) for 語句中(例如上面例子的列表 letters,可以用在 for 語句中:for e in letters:)。
下面我們來看看不同數(shù)據(jù)類型應(yīng)用 sorted()
函數(shù)的例子。需要注意的是,雖然 sorted() 的輸入可以有多種類型,但是輸出都是排序好的列表。
輸入為元組(Tuple)時(shí):
letters=('a','dc','ab','D') result=sorted(letters) print(result)
運(yùn)行結(jié)果為:
['D', 'a', 'ab', 'dc']
輸入為字符串(Str)時(shí):
letters='dasf' result=sorted(letters) print(result)
運(yùn)行結(jié)果為:
['a', 'd', 'f', 's']
從結(jié)果可以看出,輸入為字符串時(shí),輸出為排序好的字符列表,單個(gè)字符為列表的一個(gè)元素。
輸入為字典(Dict)時(shí):
letters={'b':1,'a':3,'d':2,'c':1} result=sorted(letters) print(result)
運(yùn)行結(jié)果為:
['a', 'b', 'c', 'd']
從結(jié)果可以看出,sorted()
函數(shù)輸出的結(jié)果是對(duì)letters.key()
排序得到的列表。
參考:https://docs.python.org/3/howto/sorting.html
到此這篇關(guān)于python列表排序用 sort()和sorted()的區(qū)別的文章就介紹到這了,更多相關(guān)python列表排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決django xadmin主題不顯示和只顯示bootstrap2的問題
這篇文章主要介紹了解決django xadmin主題不顯示和只顯示bootstrap2的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python使用jpype模塊調(diào)用jar包過程解析
這篇文章主要介紹了Python使用jpype模塊調(diào)用jar包過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Pytorch自己加載單通道圖片用作數(shù)據(jù)集訓(xùn)練的實(shí)例
今天小編就為大家分享一篇Pytorch自己加載單通道圖片用作數(shù)據(jù)集訓(xùn)練的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01總結(jié)網(wǎng)絡(luò)IO模型與select模型的Python實(shí)例講解
同步、異步、阻塞、非阻塞,當(dāng)這些網(wǎng)絡(luò)IO名詞堆到一起時(shí)難免使編程初學(xué)者感到困惑,這里我們就來為大家總結(jié)網(wǎng)絡(luò)IO模型與select模型的Python實(shí)例講解:2016-06-06python實(shí)戰(zhàn)練習(xí)做一個(gè)隨機(jī)點(diǎn)名的程序
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python實(shí)現(xiàn)一個(gè)隨機(jī)點(diǎn)名的程序,大家可以在過程中查缺補(bǔ)漏,提升水平2021-10-10Python操作MySQL數(shù)據(jù)庫實(shí)例詳解【安裝、連接、增刪改查等】
這篇文章主要介紹了Python操作MySQL數(shù)據(jù)庫,結(jié)合實(shí)例形式詳細(xì)分析了Python操作mysql數(shù)據(jù)庫的安裝、連接、增刪改查等相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2020-01-01