Python:根据子列表的属性对二维列表进行排序

程序员

我有一个二维列表:

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']

如何实现排序,以便我可以选择列表的某个部分,然后对其进行排序,然后根据其他列再次对其进行排序?

tobias_k

如果我理解正确,您想对列表进行排序

  • 首先是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]))

由于越界切片被评估为空列表,即使列表的元素少于开始索引或结束索引,这也有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章