欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python中如何對數據進行各種排序?

系統 1644 0

轉載:https://www.cnblogs.com/fujian-code/p/7501795.html

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

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

請注意, sort()原始數據被破壞,sorted()沒有對原始數據進行操作,而是新建了一個新數據。

一、基本的排序
最基本的排序很簡單。只要使用sorted()函數即可返回一個 新的排序的列表

>>>sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
咱們也可以使用 list.sort()方法。該方法是對列表list進行的原地操作(原數據被修改,已經不是原來的本來面目)。一般情況下,不如使用 sorted()方便,但是如果你不需要原列表list,使用 sort()會更具效率。

>>>a = [5, 2, 3, 1, 4]
>>>a.sort()
>>>a #a發生改變
[1, 2, 3, 4, 5]
另一個不同點, list.sort()方法只能應用于列表對象數據。而 sorted()卻可以對任何可迭代對象進行排序。也就是說sorted()更具有普遍使用性。這里大燈建議初學者使用sorted()。

二、Key參數函數
list.sort()和 sorted()都有key參數,可以指定函數來對元素進行排序。

例如,這里我們使用一個字符串(字符串也是可迭代對象)

>>>sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
我們指定按照首字符(統一變為小寫后的字符)進行排序。 key參數的值是一個帶有單一參數的函數,返回一個鍵key用于排序。這種技術運行挺快的,具體為啥,我不懂。

例如:

>>>student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10)]
>>>sorted(student_tuples, key = lambda student:student[2])?
"""
通過key排序。
key的值: lambda函數
lambda函數的參數 是student_tuples列表中的元素-元組
lambda函數運算的是 student_tuples列表元素中元組的第三個元素。
"""
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
同樣該方法也可作用于對象的屬性。例如這里我先定義一個屬性

>>> 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函數方法都是非常常見,所以說python提供簡潔高效的方法。 operator庫有 itemgetter(), attrgetter(), methodcaller()這三個方法。

使用上面提到的operator庫的方法,也可以實現上述例子,而且更簡單,運行更快。

>>> 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庫的方法可以提供多維度排序。例如我們隊成績和年齡同時排序,但成績的優先級高于年齡。

>>> 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參數(True或False)進行升降序調整。這里我們對student數據中 年齡age進行翻轉排序規則。

>>> 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)]

五、排序穩定性和復雜排序
排序要保障穩定,這意味著當多個記錄擁有同一個key時,原始的數據中的排序會保留下來。

>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
注意為何兩個記錄中的blue保留了原始數據的數據,所以按照原始數據順序,('blue', 1)比('blue', 2)優先。

這個奇妙的特性讓咱們可以使用一系列排序步驟來構建復雜的排序方法。例如,對student數據的 成績grade進行降序,再對 年齡age進行升序排序。實現方法:首先對age排序,再對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參數
cmp也就是compare,對比比較。在2.x時代,都支持cmp參數方法。

在3.x中,cmp參數被徹底移除。

在2.x中,sort允許一個可選的函數,可以進行比較compare。 該功能應該采取要比較兩個參數,然后返回的負值代表小于;返回零,代表相等;正值代表大于。 在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]

如果想讓排序變為降序,可以使用下面

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人18黄禁网站免费观看 | 热@国产| 亚洲免费看片 | 亚洲福利| 久草com | 亚洲天天综合色制服丝袜在线 | 剑来高清在线观看 | 亚洲成人一区二区 | 日韩欧美在线视频不卡免费视频 | 午夜精品一区二区三区在线观看 | 日本不卡在线 | 日本欧美一二三区色视频 | 清纯唯美综合 | 天堂热| 日韩2区 | 精品人成 | 色两性午夜视频免费观看 | 天堂网果冻传媒 | 香蕉久草在线 | 久久国产乱子伦精品免 | 美腿丝袜亚洲综合 | 久久久精选 | 亚洲午夜剧场 | 亚洲AV无码色情第一综合网 | 青娱乐免费视频在线观看 | 亚洲ci网| 色吊丝国产 | 美美女高清毛片视频免费观看 | 久久精品亚洲成在人线av网址 | 日本夜爽爽一区二区三区 | 美女一区| 91手机在线观看 | 男女搞逼视频 | 亚洲精品免费在线视频 | 蜜桃视频一区二区三区 | 中文字幕视频在线 | 波多野结衣hd在线播放 | 欧美国产一区二区三区 | 免费黄色大片 | 国产三级在线观看视频 | 青草视频网址 |