python中對(duì)數(shù)據(jù)進(jìn)行各種排序的方法
Python列表具有內(nèi)置的 list.sort()方法,可以在原地修改列表。 還有一個(gè) sorted()內(nèi)置的函數(shù)從迭代構(gòu)建一個(gè)新的排序列表。在本文中,我們將探討使用Python排序數(shù)據(jù)的各種技術(shù)。
請(qǐng)注意,sort()原始數(shù)據(jù)被破壞,sorted()沒有對(duì)原始數(shù)據(jù)進(jìn)行操作,而是新建了一個(gè)新數(shù)據(jù)。
一、基本的排序
最基本的排序很簡(jiǎn)單。只要使用sorted()函數(shù)即可返回一個(gè) 新的排序的列表
>>>sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5]
咱們也可以使用 list.sort()方法。該方法是對(duì)列表list進(jìn)行的原地操作(原數(shù)據(jù)被修改,已經(jīng)不是原來的本來面目)。一般情況下,不如使用 sorted()方便,但是如果你不需要原列表list,使用 sort()會(huì)更具效率。
>>>a = [5, 2, 3, 1, 4] >>>a.sort() >>>a #a發(fā)生改變 [1, 2, 3, 4, 5]
另一個(gè)不同點(diǎn), list.sort()
方法只能應(yīng)用于列表對(duì)象數(shù)據(jù)。而 sorted()卻可以對(duì)任何可迭代對(duì)象進(jìn)行排序。也就是說sorted()更具有普遍使用性。這里大燈建議初學(xué)者使用sorted()。
二、Key參數(shù)函數(shù)
list.sort()和 sorted()都有key參數(shù),可以指定函數(shù)來對(duì)元素進(jìn)行排序。
例如,這里我們使用一個(gè)字符串(字符串也是可迭代對(duì)象)
>>>sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
我們指定按照首字符(統(tǒng)一變?yōu)樾懞蟮淖址┻M(jìn)行排序。 key參數(shù)的值是一個(gè)帶有單一參數(shù)的函數(shù),返回一個(gè)鍵key用于排序。這種技術(shù)運(yùn)行挺快的,具體為啥,我不懂。
例如:
>>>student_tuples = [ ... ('john', 'A', 15), ... ('jane', 'B', 12), ... ('dave', 'B', 10)] >>>sorted(student_tuples, key = lambda student:student[2]) """
通過key排序。
key的值: lambda函數(shù)
lambda函數(shù)的參數(shù) 是student_tuples列表中的元素-元組
lambda函數(shù)運(yùn)算的是 student_tuples列表元素中元組的第三個(gè)元素。
""" [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
同樣該方法也可作用于對(duì)象的屬性。例如這里我先定義一個(gè)屬性
>>> class Student: ... def __init__(self, name, grade, age): ... self.name = name ... self.grade = grade ... self.age = age ... def __repr__(self): ... return repr((self.name, self.grade, self.age)) >>> student_objects = [ ... Student('john', 'A', 15), ... Student('jane', 'B', 12), ... Student('dave', 'B', 10)] >>> sorted(student_objects, key=lambda student: student.age) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
三、Operator庫的方法
上面列的那些key函數(shù)方法都是非常常見,所以說python提供簡(jiǎn)潔高效的方法。 operator庫有 itemgetter(), attrgetter(), methodcaller()這三個(gè)方法。
使用上面提到的operator庫的方法,也可以實(shí)現(xiàn)上述例子,而且更簡(jiǎn)單,運(yùn)行更快。
>>> from operator import itemgetter, attrgetter >>> sorted(student_tuples, key=itemgetter(2)) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(student_objects, key=attrgetter('age')) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
operator庫的方法可以提供多維度排序。例如我們隊(duì)成績和年齡同時(shí)排序,但成績的優(yōu)先級(jí)高于年齡。
>>> sorted(student_tuples, key=itemgetter(1,2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] >>> sorted(student_objects, key=attrgetter('grade', 'age')) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
四、升序與降序
list.sort()和 sorted()都可以通過reverse參數(shù)(True或False)進(jìn)行升降序調(diào)整。這里我們對(duì)student數(shù)據(jù)中 年齡age進(jìn)行翻轉(zhuǎn)排序規(guī)則。
>>> sorted(student_tuples, key=itemgetter(2), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] >>> sorted(student_objects, key=attrgetter('age'), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
五、排序穩(wěn)定性和復(fù)雜排序
排序要保障穩(wěn)定,這意味著當(dāng)多個(gè)記錄擁有同一個(gè)key時(shí),原始的數(shù)據(jù)中的排序會(huì)保留下來。
>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] >>> sorted(data, key=itemgetter(0)) [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
注意為何兩個(gè)記錄中的blue保留了原始數(shù)據(jù)的數(shù)據(jù),所以按照原始數(shù)據(jù)順序,('blue', 1)比('blue', 2)優(yōu)先。
這個(gè)奇妙的特性讓咱們可以使用一系列排序步驟來構(gòu)建復(fù)雜的排序方法。例如,對(duì)student數(shù)據(jù)的 成績grade進(jìn)行降序,再對(duì) 年齡age進(jìn)行升序排序。實(shí)現(xiàn)方法:首先對(duì)age排序,再對(duì)grade排序。
>>> s = sorted(student_objects, key=attrgetter('age')) >>> sorted(s, key=attrgetter('grade'), reverse=True) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
六、老辦法-使用cmp參數(shù)
cmp也就是compare,對(duì)比比較。在2.x時(shí)代,都支持cmp參數(shù)方法。
在3.x中,cmp參數(shù)被徹底移除。
在2.x中,sort允許一個(gè)可選的函數(shù),可以進(jìn)行比較compare。 該功能應(yīng)該采取要比較兩個(gè)參數(shù),然后返回的負(fù)值代表小于;返回零,代表相等;正值代表大于。 在3.x中,使用cmp思想,我們可以這樣做:
>>> def numeric_compare(x, y): ... return x - y >>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare) [1, 2, 3, 4, 5]
如果想讓排序變?yōu)榻敌?,可以使用下?/p>
>>> def reverse_numeric(x, y): ... return y - x >>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric) [5, 4, 3, 2, 1]
總結(jié)
以上所述是小編給大家介紹的python中對(duì)數(shù)據(jù)進(jìn)行各種排序的方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python實(shí)現(xiàn)生成多種有規(guī)律的數(shù)字序列
在?Python?編程中,生成數(shù)字序列是一項(xiàng)常見且重要的任務(wù),本文將深入探討如何使用Python中的內(nèi)置函數(shù)、列表推導(dǎo)式、生成器等方式來生成多種有規(guī)律的數(shù)字序列,需要的可以參考下2024-03-03Python+Pygame實(shí)現(xiàn)之走四棋兒游戲的實(shí)現(xiàn)
大家以前應(yīng)該都聽說過一個(gè)游戲:叫做走四棋兒。直接在家里的水泥地上用燒完的炭火灰畫出幾條線,擺上幾顆石頭子即可。當(dāng)時(shí)的火爆程度可謂是達(dá)到了一個(gè)新的高度。本文將利用Pygame實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-07-07Python實(shí)現(xiàn)判斷一行代碼是否為注釋的方法
今天小編就為大家分享一篇Python實(shí)現(xiàn)判斷一行代碼是否為注釋的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-0513個(gè)Pandas實(shí)用技巧,助你提高開發(fā)效率
這篇文章主要介紹了13個(gè)Pandas實(shí)用技巧,幫助你提高python開發(fā)的效率,感興趣的朋友可以了解下2020-08-08詳解Python如何解析JSON中的對(duì)象數(shù)組
這篇文章主要為大家詳細(xì)介紹了如何使用Python的JSON模塊傳輸和接收J(rèn)SON數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10Python新手學(xué)習(xí)標(biāo)準(zhǔn)庫模塊命名
在本篇內(nèi)容中,小編給大家分享的是關(guān)于Python標(biāo)準(zhǔn)庫模塊命名詳解內(nèi)容,有需要的朋友們可以參考下。2020-05-05如何使用Python的Requests包實(shí)現(xiàn)模擬登陸
這篇文章主要為大家詳細(xì)介紹了使用Python的Requests包模擬登陸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python常用數(shù)據(jù)結(jié)構(gòu)和公共方法技巧總結(jié)
這篇文章主要介紹了Python常用數(shù)據(jù)結(jié)構(gòu)和公共方法技巧總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08Python+selenium點(diǎn)擊網(wǎng)頁上指定坐標(biāo)的實(shí)例
今天小編就為大家分享一篇Python+selenium點(diǎn)擊網(wǎng)頁上指定坐標(biāo)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07