簡體   English   中英

如何使用python對復雜列表進行排序?

[英]How to sort a complex list with python?

輸入清單

lst = [311, 409, 305, 104, 301, 204, 101, 306, 313, 202, 303, 410, 401, 105, 407, 408]

不需要的輸出( lst.sort() ):

[101, 104, 105, 202, 204, 301, 303, 305, 306, 311, 313, 401, 407, 408, 409, 410]

預期產量:

[101, 301, 401, 202, 303, 104, 204, 105, 305, 306, 407, 408, 409, 410, 311, 313]

最后兩位數字升序排列,而第一位數字升序排列。 我不確定如何處理這種情況。 我試過使用lst.sort()但這不能完成任務。 我已經研究了其他實現密鑰的帖子,但是我以前從未使用過,並且不知道如何在此代碼中實現。

如果要輸出[101,301,401,202,303,104,204,105,305,306,407,408,409,410,311,313] ,則可以使用以下命令:

def my_key(x):
    return x%100, x/100


print(sorted(lst, key=my_key))

或使用lambda函數:

print(sorted(lst, key=lambda x: (x%100, x/100))

這樣就完成了工作:

lst.sort(key=lambda x: str(x)[1:] + str(x)[0])

輸出:

[101, 301, 401, 202, 303, 104, 204, 105, 305, 306, 407, 408, 409, 410, 311, 313]

另外,正如@gdelab正確說的那樣,您可以使用除法進行操作:

lst.sort(key=lambda x: (x % 100, x / 100))

說明

str(x)[1:] + str(x)[0] 創建一個字符串該字符串以后兩位數字開頭(假設您的數字始終為3位數字),並以第一位數字結尾。 因此它映射為:311->'113',依此類推,從而按所需順序獲取數字。

似乎不清楚您要問什么。 聽起來您標題的含義更接近於“如何在Python中按自定義排序順序進行排序?”

這是我對您問題的重述。 如果錯了,那么我的答案也將是錯的。

I want to sort a list in a special way.  Each item is a three digit number and I want to sort by the last two digits, then by the first digit.  That is, I want to do something like this:

 > my_list=[311, 409, 305, 104, 301, 204, 101, 306, 313, 202, 303, 410, 401, 105, 407, 408]
 > my_list.sort()
 > print(my_list)
 [101,301,401,202,303,104,204,105,305,306,407,408,409,410,311,313]

也就是說,這里有一些想法:

  • 這個問題可能是相關的: Python:如何自定義排序列表?
  • 自定義排序需要您創建一個正常排序的臨時值。 即,您為每個輸入設置一個中間值並對中間值進行排序。
  • (305 % 100)*10 + 305 // 100等於5*10+353
  • 一起獲得print(sorted(my_list, key=lambda x: (x % 100) * 10 + x // 100))

試着真正弄明白為什么這行得通; 類似的問題是傳統的作業問題。

純Python解決方案是首先使用模數( % )運算符排序,然后通過下限除法( // )運算符排序:

L = [311, 409, 305, 104, 301, 204, 101, 306, 313, 202, 303, 410, 401, 105, 407, 408]

res = sorted(L, key=lambda x: (x % 100, x // 100))

對於數字數據,第3方庫(例如NumPy)將支持矢量化操作:

import numpy as np

A = np.array(L)

res = A[np.lexsort((A // 100, A % 100))]

array([101, 301, 401, 202, 303, 104, 204, 105, 305, 306, 407, 408, 409,
       410, 311, 313])

暫無
暫無

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

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