簡體   English   中英

Python:按不是一個,而是兩個標准對列表進行排序

[英]Python: Sort list of lists by not one, but two criteria

我有一個 Python 排序問題,類似於我在 stackoverflow 上發現的其他問題,但不完全相同。 讓我告訴你,也許有人可以幫助:

假設我們有一個可能如下所示的列表列表:

p = [[6, 'k'], [5, 'l'], [2, 'p'], [2, 'd'], [5, 'k']]

我想按兩個 (.) 標准對此進行排序。 按一個標准對其進行排序是相當容易和直接的。 假設我想首先按每個列表的第一項對其進行排序:我可以這樣實現:

sorted_p = sorted(p, key=lambda x:int(x[0]))

到目前為止,一切都很好。 我會得到以下 sorted_p:

[[2,'p'], [2, 'd'], [5, 'l'], [5, 'k'], [6, 'k']]

現在真正的麻煩開始了:我希望在第一項多次出現的情況下(例如,我們有兩個以 2 開頭的元組和兩個以 5 開頭的元組),然后這些元組按元組的第二項排序. 所以我想得到的結果是

[[2,'d'], [2, 'p'], [5, 'k'], [5, 'l'], [6, 'k']]

有誰知道我該怎么做?

感謝您的每一個提示!

如果您傳遞一個元組,Python 會自動按超過 1 個條件排序。 在您的情況下,它將是:

p = [[6, 'k'], [5, 'l'], [2, 'p'], [2, 'd'], [5, 'k']]
sorted_p = sorted(p, key=lambda x:(int(x[0]),x[1]))

接受的答案很棒。 只需在不使用內置排序的情況下添加另一個答案,以防可以擴展它。

def custom_bubble_sort(arr):
    for i in range(len(arr)-1):
        for j in range(len(arr)-i-1):
            if arr[j][0] > arr[j+1][0]:
                temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            elif arr[j][0] == arr[j+1][0] and ord(arr[j][1]) > ord(arr[j+1][1]):
                    temp = arr[j]
                    arr[j] = arr[j+1]
                    arr[j+1] = temp
    return arr

print(custom_bubble_sort([[6, 'k'], [5, 'l'], [2, 'p'], [2, 'd'], [5, 'k']]))

我認為使用operator.itemgetter的這個版本比lambda版本讀得更好:

import operator
p = [[6, 'k'], [5, 'l'], [2, 'p'], [2, 'd'], [5, 'k']]
sorted_p = sorted(p, key=operator.itemgetter(0, 1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM