[英]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]
也就是說,這里有一些想法:
(305 % 100)*10 + 305 // 100
等於5*10+3
或53
。 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.