我有一個二維串列:
ls = [
['-2,60233106656288100', '2', 'C'],
['-9,60233106656288100', '2', 'E'],
['-4,60233106656288100', '2', 'E'],
['-3,60233106656288100', '2', 'C'],
['-5,60233106656288100', '4', 'T'],
['-0,39019660724115224', '3', 'E'],
['-3,60233106656288100', '2', 'T'],
['-6,01086748514074000', '1', 'Q'],
['-5,02684650459461800', '0', 'X'],
['-1,25228509312138300', 'A', 'N'],
['-0,85517128843547330', '3', 'E'],
['1,837508975733196200', '3', '-', 'E'],
['1,850925075915637700', '5', '-', 'T'],
['1,826767133229081000', '4', '-', 'C'],
['1,845357865328532300', '3', '-', 'E'],
['0,636275318914609100', 'a', 'n', 'N']
]
我想先對其進行排序,以便較短的子串列根據第二列排序,然后根據第三列排序,以便串列保持根據第二列排序(第一行在第二列中有 0,然后是 1,然后是五個二等。但是兩個二交換位置,所以我首先有兩個 E,然后是兩個 C,然后是 T)。之后,我想根據第四列對較長的子串列進行排序。我擁有的行A應該是較短串列中的最后一個,而我擁有的行a應該是最后一行。所以輸出應該如下:
[
['-5,02684650459461800', '0', 'X'],
['-6,01086748514074000', '1', 'Q'],
['-9,60233106656288100', '2', 'E'],
['-4,60233106656288100', '2', 'E'],
['-3,60233106656288100', '2', 'C'],
['-2,60233106656288100', '2', 'C'],
['-3,60233106656288100', '2', 'T'],
['-0,39019660724115224', '3', 'E'],
['-0,85517128843547330', '3', 'E'],
['-5,60233106656288100', '4', 'T'],
['-1,25228509312138300', 'A', 'N'],
['1,837508975733196200', '3', '-', 'E'],
['1,845357865328532300', '3', '-', 'E'],
['1,826767133229081000', '4', '-', 'C'],
['1,850925075915637700', '5', '-', 'T'],
['0,636275318914609100', 'a', 'n', 'N']
]
我知道我可以根據第二列排序為:
ls.sort(key=lambda x:x[1])
但這會對整個串列進行排序并給出:
['-5,02684650459461800', '0', 'X']
['-6,01086748514074000', '1', 'Q']
['-2,60233106656288100', '2', 'C']
['-9,60233106656288100', '2', 'E']
['-4,60233106656288100', '2', 'E']
['-3,60233106656288100', '2', 'C']
['-3,60233106656288100', '2', 'T']
['-0,39019660724115224', '3', 'E']
['-0,85517128843547330', '3', 'E']
['1,837508975733196200', '3', '-', 'E']
['1,845357865328532300', '3', '-', 'E']
['-5,60233106656288100', '4', 'T']
['1,826767133229081000', '4', '-', 'C']
['1,850925075915637700', '5', '-', 'T']
['-1,25228509312138300', 'A', 'N']
['0,636275318914609100', 'a', 'n', 'N']
如何實作排序,以便我可以選擇串列的某個部分,然后對其進行排序,然后根據其他列再次對其進行排序?
uj5u.com熱心網友回復:
如果我理解正確,您想對串列進行排序
- 首先是
len子串列, - 然后通過串列中的每個元素,除了第一個元素,使用下一個元素作為決勝局,以防前一個元素都相等
為此,您可以使用 atuple作為搜索鍵,使用len從第二個元素(即在 index 處1)開始的子串列的和切片:
ls.sort(key=lambda x: (len(x), x[1:]))
請注意,這還將使用第四個之后的元素作為進一步的決勝局,這可能是不需要的。這也會創建所有子串列的臨時(接近)副本,如果串列較長,這可能會令人望而卻步,即使所有比較都可能在第 3 個或第 4 個元素之后決定。
或者,如果您只需要前四個、前十個或任意數量的元素,您可以創建一個封閉切片并使用它進行比較:
ls.sort(key=lambda x: (len(x), x[1:4]))
由于越界切片被評估為空串列,即使串列的元素少于開始索引或結束索引,這也有效。
uj5u.com熱心網友回復:
怎么樣:
ls.sort(key=lambda x: (l := len(x), x[1], '' if l < 4 else x[3]))
這將首先按子串列的長度排序,然后按第 2 列,最后按第 4 列,如果有的話(如果沒有的''話,仍然會一直排序到頂部)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490690.html
標籤:Python 数组 python-3.x 排序
