[英]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.