日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python中如何對(duì)數(shù)據(jù)進(jìn)行各種排序?

系統(tǒng) 1732 0

轉(zhuǎn)載:https://www.cnblogs.com/fujian-code/p/7501795.html

Python列表具有內(nèi)置的 list.sort()方法,可以在原地修改列表。 還有一個(gè) sorted()內(nèi)置的函數(shù)從迭代構(gòu)建一個(gè)新的排序列表。

在本文中,我們將探討使用Python排序數(shù)據(jù)的各種技術(shù)。轉(zhuǎn)自http://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247484360&idx=2&sn=5e0d78a129f7be71dee355ae1492b8b9&chksm=ec5edcb5db2955a37972ca8bd3fd22572914dac8b4852e622a5afd8b24b999f4967bed7e444d&mpshare=1&scene=23&srcid=0910RYUt9YnMlda0hid9zem2#rd

請(qǐng)注意, sort()原始數(shù)據(jù)被破壞,sorted()沒(méi)有對(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)不是原來(lái)的本來(lái)面目)。一般情況下,不如使用 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)行排序。也就是說(shuō)sorted()更具有普遍使用性。這里大燈建議初學(xué)者使用sorted()。

二、Key參數(shù)函數(shù)
list.sort()和 sorted()都有key參數(shù),可以指定函數(shù)來(lái)對(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)樾?xiě)后的字符)進(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])?
"""
通過(guò)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庫(kù)的方法
上面列的那些key函數(shù)方法都是非常常見(jiàn),所以說(shuō)python提供簡(jiǎn)潔高效的方法。 operator庫(kù)有 itemgetter(), attrgetter(), methodcaller()這三個(gè)方法。

使用上面提到的operator庫(kù)的方法,也可以實(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庫(kù)的方法可以提供多維度排序。例如我們隊(duì)成績(jī)和年齡同時(shí)排序,但成績(jī)的優(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()都可以通過(guò)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ì)保留下來(lái)。

>>> 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è)奇妙的特性讓咱們可以使用一系列排序步驟來(lái)構(gòu)建復(fù)雜的排序方法。例如,對(duì)student數(shù)據(jù)的 成績(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)榻敌颍梢允褂孟旅?

>>> def reverse_numeric(x, y):
... return y - x
>>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric)
[5, 4, 3, 2, 1]


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 祁连县| 蓝田县| 溆浦县| 鹤峰县| 湄潭县| 清新县| 罗甸县| 马山县| 邹城市| 白城市| 昔阳县| 正安县| 江源县| 乳山市| 阿克| 霞浦县| 芦山县| 松原市| 金溪县| 保靖县| 衡水市| 祁门县| 石景山区| 南昌市| 莱阳市| 民权县| 三台县| 阿拉尔市| 抚顺县| 嘉荫县| 凌云县| 马山县| 武鸣县| 高淳县| 扶余县| 荔波县| 长丰县| 财经| 合山市| 灯塔市| 沐川县|