溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python中對數(shù)據(jù)進行各種排序的方法

發(fā)布時間:2020-10-15 09:58:09 來源:腳本之家 閱讀:151 作者:change_world 欄目:開發(fā)技術(shù)

Python列表具有內(nèi)置的 list.sort()方法,可以在原地修改列表。 還有一個 sorted()內(nèi)置的函數(shù)從迭代構(gòu)建一個新的排序列表。在本文中,我們將探討使用Python排序數(shù)據(jù)的各種技術(shù)。

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

一、基本的排序

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

>>>sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

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

>>>a = [5, 2, 3, 1, 4]
>>>a.sort()
>>>a #a發(fā)生改變
[1, 2, 3, 4, 5]

另一個不同點, list.sort()方法只能應用于列表對象數(shù)據(jù)。而 sorted()卻可以對任何可迭代對象進行排序。也就是說sorted()更具有普遍使用性。這里大燈建議初學者使用sorted()。

二、Key參數(shù)函數(shù)

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

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

>>>sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

我們指定按照首字符(統(tǒng)一變?yōu)樾懞蟮淖址┻M行排序。 key參數(shù)的值是一個帶有單一參數(shù)的函數(shù),返回一個鍵key用于排序。這種技術(shù)運行挺快的,具體為啥,我不懂。

例如:

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

使用上面提到的operator庫的方法,也可以實現(xià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庫的方法可以提供多維度排序。例如我們隊成績和年齡同時排序,但成績的優(yōu)先級高于年齡。

>>> 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)進行升降序調(diào)整。這里我們對student數(shù)據(jù)中 年齡age進行翻轉(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)定性和復雜排序

排序要保障穩(wěn)定,這意味著當多個記錄擁有同一個key時,原始的數(shù)據(jù)中的排序會保留下來。

>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]

注意為何兩個記錄中的blue保留了原始數(shù)據(jù)的數(shù)據(jù),所以按照原始數(shù)據(jù)順序,('blue', 1)比('blue', 2)優(yōu)先。

這個奇妙的特性讓咱們可以使用一系列排序步驟來構(gòu)建復雜的排序方法。例如,對student數(shù)據(jù)的 成績grade進行降序,再對 年齡age進行升序排序。實現(xiàn)方法:首先對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參數(shù)

cmp也就是compare,對比比較。在2.x時代,都支持cmp參數(shù)方法。

在3.x中,cmp參數(shù)被徹底移除。

在2.x中,sort允許一個可選的函數(shù),可以進行比較compare。 該功能應該采取要比較兩個參數(shù),然后返回的負值代表小于;返回零,代表相等;正值代表大于。 在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中對數(shù)據(jù)進行各種排序的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI