python列表排序用?sort()和sorted()的區(qū)別
前言:
內(nèi)容提要:本文比較了 Python 中用于列表排序的兩種函數(shù) sort() 和 sorted(),幫助您選擇合適的排序函數(shù)。
對列表排序時(shí),既可以用 List.sort(),也可以用 sorted(List),這兩個(gè)函數(shù)有什么不同呢?如何選擇?我以前常常分不清這兩個(gè)函數(shù),等到程序報(bào)錯(cuò)了,才知道 sorted 寫成 sort 了,List 不能寫在 sort() 括號里。您是否也有這個(gè)困惑呢?那就一起通過例子來熟悉這兩個(gè)函數(shù)吧,以后就知道應(yīng)該怎么使用了。
1. 是否改變原列表
首先應(yīng)用 List.sort() 對列表排序,
代碼示例如下:
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)楦牧嗽斜?,新手在程序設(shè)計(jì)時(shí)容易忽視這一點(diǎn),在后續(xù)程序中錯(cuò)誤地操作列表,導(dǎo)致得不到預(yù)計(jì)的結(jié)果。
再來看一下應(yīng)用 sorted(List) 對列表排序的效果,
代碼示例如下:
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ù)上述對比,在選擇排序函數(shù)時(shí),我們需要考慮兩點(diǎn):
- 1.是否希望改變原列表,如果是,選擇 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ù),對 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ù)同樣是對 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() 是列表對象(object)的一個(gè)方法(method),因此只能用于列表。
而sorted() 函數(shù)是 Python 語言的內(nèi)置函數(shù),可以用于 iterables,包括 列表(List),元組(Tuple),字典(Dict)等等。iterable 對象有一個(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é)果是對letters.key() 排序得到的列表。
參考:https://docs.python.org/3/howto/sorting.html
到此這篇關(guān)于python列表排序用 sort()和sorted()的區(qū)別的文章就介紹到這了,更多相關(guān)python列表排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解python string類型 bytes類型 bytearray類型
這篇文章主要介紹了python string類型 bytes類型 bytearray類型,需要的朋友可以參考下2017-12-12
使用pyshp包進(jìn)行shapefile文件修改的例子
今天小編就為大家分享一篇使用pyshp包進(jìn)行shapefile文件修改的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
OpenCV圖像識別之相機(jī)校準(zhǔn)Camera?Calibration學(xué)習(xí)
這篇文章主要為大家介紹了OpenCV圖像識別之相機(jī)校準(zhǔn)Camera?Calibration學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
python?opencv的imread方法無法讀取圖片問題
這篇文章主要介紹了python?opencv的imread方法無法讀取圖片問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python中使用filter過濾列表的一個(gè)小技巧分享
這篇文章主要介紹了Python中使用filter過濾列表的一個(gè)小技巧分享,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python圖形開發(fā)GUI庫pyqt5的詳細(xì)使用方法及各控件的屬性與方法
這篇文章主要介紹了python圖形開發(fā)GUI庫pyqt5的詳細(xì)使用方法及各控件的屬性與方法,需要的朋友可以參考下2020-02-02
pandas?Dataframe實(shí)現(xiàn)批量修改值的方法
這篇文章主要介紹了pandas?Dataframe實(shí)現(xiàn)批量修改值的方法,在使用dataframe的時(shí)候?有時(shí)候會碰到需要批量修改數(shù)據(jù)的時(shí)候,下面文章主要說明兩種情況使用iloc對某幾行某幾列進(jìn)行全部修該和對數(shù)據(jù)進(jìn)行判定后,相互+/-/*某個(gè)數(shù),使用內(nèi)置函數(shù),需要的朋友可以參考一下2022-06-06

