Python教程:sort和sorted實現排序之對比

小小程序员ol發表於2024-07-10

總的來說,sort 是應用在列表上的方法,修改原始列表。

內建函式 sorted 可對所有可迭代的物件進行排序操作,返回新的物件。

list.sort() 方法效率會比 sorted(iter) 稍微高些。

一、sort函式

sort() 函式用於對原列表進行排序,如果指定引數,則依據指定的函式進行排序。

列表才可以進行修改,元組無法修改。

1.語法

list.sort(cmp=None, key=None, reverse=False)
# cmp引數在python2.0中存在
# 3.0版本已刪除

2.引數

cmp -- 可選 使用該引數方法進行排序
key -- 用來進行比較的元素 取自可迭代物件
reverse -- 排序規則

  • reverse=True -- 降序
  • reverse=False -- 升序(預設)

該方法對原始列表進行排序,無返回。

3.實操

# 升序
aList = [5, 4, 1, 3, 6, 2]
aList.sort() # [1, 2, 3, 4, 5, 6]

# 降序
aList = [5, 4, 1, 3, 6, 2]
aList.sort(reverse=True)
aList # [6, 5, 4, 3, 2, 1]

# 指定元素排序
# 獲取列表第2個元素
def takeSecond(elem):
    return elem[1]
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]

random.sort(key=takeSecond)
random # [(4, 1), (2, 2), (1, 3), (3, 4)]

# 按長度
x = ['a', 'bbb', 'cc']
x.sort(key=len)
print(x) # ['a', 'cc', 'bbb']

# 自定義比較函式
def comp(x, y):
    if x < y:
        return 1
    elif x > y:
        return -1
    else:
        return 0

aList = [5, 4, 1, 3, 6, 2]
aList.sort(comp) # 降序  2.0版本才支援
# 測試的當前版本不支援

4.其他技巧

生成一個排序好的副本,以及原始列表不變。

# 方法一
aList = [5, 4, 1, 3, 6, 2]
bList = aList[:]  # 深度copy
# bList = aList.copy()
bList.sort()
print(aList) # [5, 4, 1, 3, 6, 2]
print(bList) # [1, 2, 3, 4, 5, 6]

# 方法二 使用sorted
aList = [5, 4, 1, 3, 6, 2]
bList = sorted(aList) # [1, 2, 3, 4, 5, 6]

透過切片操作進行複製,不可簡單的進行賦值,否則指向的還是同一個儲存地址的列表。

二、sorted函式

sorted() 函式對所有可迭代的物件進行排序操作。

1.語法

sorted(iterable, key=None, reverse=False)

2.引數

iterable -- 可迭代物件
key -- 指定可迭代物件中的一個元素
reverse -- 排序規則 降序、升序

該函式返回重新排序的列表,注意返回的都是列表。

3.實操

# 預設排序
a = [5, 2, 3, 1, 4]
sorted(a) # [1, 2, 3, 4, 5]

# 字典
b = {1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}
sorted(b) # [1, 2, 3, 4, 5]
# 按key排序,同時將key返回為一個列表

# 按鍵排序
sorted(b.items(), key=lambda x: x[0])
#學習中遇到問題沒人解答?小編建立了一個Python學習交流群:725638078
# 按值長度排序
sorted(b.items(), key=lambda x: len(x[1]))

4.其他

# 獎牌排行
s = "德國 10 11 16\n義大利 10 10 20\n荷蘭 10 12 14\n法國 10 12 11\n英國 22 21 22\n中國 38 32 18\n日本 27 14 17\n美國 39 41 33\n俄羅斯奧委會 20 28 23\n澳大利亞 17 7 22\n匈牙利 6 7 7\n加拿大 7 6 11\n古巴 7 3 5\n巴西 7 6 8\n紐西蘭 7 6 7"
stodata = s.split('\n', -1)
para = {}
for line in range(len(stodata)):
    data = stodata[line].split(' ')
    print(data)
    para[data[0]] = [int(i) for i in data[1:]]

new_para = sorted(para.items(), key=lambda x: (x[1], x[0]))

相關文章