Python列表的排序指南


Python中常用的排序方法

sorted()

sorted()函數是Python中的內置函數,它可以從一個可迭代對象構建出一個新的列表。

a = [4, 28, 3, 22, 9, 6]
b = sorted(a)
print("a:", a)  # 原列表
print("b:", b)  # 排序后的列表

結果如下

a: [4, 28, 3, 22, 9, 6]
b: [3, 4, 6, 9, 22, 28]

可以看出,用sorted()函數排序后原列表元素順序不變,而新的列表則按升序排序。
如果只是做簡單的列表升序排序,可以直接使用sorted()方法來實現。

list.sort()

list.sort()是Python列表的一個內置方法,它跟sorted()方法不同的是,它會直接修改原列表。

a = [6, 3, 9, 7, 11, 2]
a.sort()
print(a)

結果如下

[2, 3, 6, 7, 9, 11]

原列表中元素的順序發生了改變。

reversed()

reversed()函數返回一個反轉的迭代器

a = [6, 3, 9, 7, 11, 2]
b = reversed(a)  # 反轉的迭代器
c = list(reversed(a))  # 迭代器轉換成列表
print("a:", a)
print("b:", b)
print("c:", c)

結果如下

a: [6, 3, 9, 7, 11, 2]
b: <list_reverseiterator object at 0x0000029EF7535C48>
c: [2, 11, 7, 9, 3, 6]

reversed()函數用在列表中會返回一個迭代器對象,可以使用list()方法將迭代器轉換為列表

list.reverse()

list.reverse()也是Python列表的一個方法,用於反向列表的元素,和reversed()函數差不多

a = [6, 3, 9, 7, 11, 2]
a.reverse()
print(a)

結果如下

[2, 11, 7, 9, 3, 6]

類型list.sort(),它也會直接改變原列表的元素順序

random.shuffle()

在random庫中有一個shuffle()方法可以將列表的所有元素進行隨機排序

a = [1, 2, 3, 4, 5, 6]
random.shuffle(a)
print(a)

結果如下

[4, 3, 6, 2, 1, 5]

原列表的元素順序被隨機打亂

深入探討sorted()函數

上面介紹了Python中常用的排序方法,其中sorted()方法還有很多比較實用的地方。

重要參數說明
sorted(iterable, key=None, reverse=False)

其中:

  1. iterable -- 可迭代對象
  2. key -- 關鍵函數
  3. reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
對可迭代對象進行排序

list.sort()方法只是為列表定義的,而sorted()方法可以接受任何可迭代對象。
我們嘗試對一個字典進行sorted()排序

a = {4: 'four', 3: 'three', 9: 'nine', 6: 'six'}
b = sorted(a)
print(b)

結果如下

[3, 4, 6, 9]

得到的結果是一個列表(其實就是dict.keys()列表,字典中的鍵列表)

實際上,sorted()函數是不能對字典進行排序的,因為在Python中字典是無序的。
如果實在想得到一個有序字典,你可以使用collections模塊中OrderedDict()來生成一個有序字典。

關鍵函數

sorted()中的形參key是用於指定排序前對列表中的每個元素進行調用的函數。

a = 'Whatever Is worth Doing is Worth doing well'
b = sorted(a.split(), key=str.lower)
print(b)

結果如下

['Doing', 'doing', 'is', 'Is', 'well', 'Whatever', 'worth', 'Worth']

上面的key=str.lower是先對列表中的每一個變成小寫字母的單詞進行比較,再對原列表進行升序排序。

key形參的值是一個函數,它接收一個參數並返回一個用於排序的鍵

def last(t):
    """t參數是一個元組,返回元組中的最后一個元素"""
    return t[-1]

a = [
    ('Tony', 'A', 90),
    ('Lisa', 'C', 88),
    ('Jack', 'B', 95),
]
b = sorted(a, key=last)
print(b)

結果如下

[('Lisa', 'C', 88), ('Tony', 'A', 90), ('Jack', 'B', 95)]

以上例子的key值是一個last函數,用於獲取元組中最后一個元素,而a列表中的元素是格式相同的元組,
因此通過last函數可以獲取列表中的每一個元組最后一個元素,也就是90, 88, 95這三個值來比較,升序排序后就得到最后的結果。

同樣,我們的key值也可以使用lambda表達式形式,簡化以上過程如下

a = [
    ('Tony', 'A', 90),
    ('Lisa', 'C', 88),
    ('Jack', 'B', 95),
]
b = sorted(a, key=lambda t: t[-1])
print(b)

結果跟上面的一樣

上面只是對形參key的使用進行了簡單的演示,你也可以用在其他方面,如一些具有命名屬性的對象。
還可以使用Operator模塊函數來使訪問器功能更容易、更便捷,這里就不過多演示了,有興趣可以自行搜索相關資料。

升序和降序

最后就是reverse參數,用於決定列表升序還是降序排序。

a = [4, 3, 9, 6, 28, 22]
b = sorted(a, reverse=True)
print(b)

結果如下

[28, 22, 9, 6, 4, 3]

設置reverse=True就可以對列表進行降序排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM