如何将两级排序应用于嵌套列表?

How to apply two level sorting to a nested list?

我正在尝试首先根据每个子列表的第一个元素,然后根据每个子列表的第二个元素对下面的嵌套列表进行排序。

我可以根据每个子列表的第一个元素进行排序

from operator import itemgetter

L = [
        [1001, 2513, 894, 631],
        [1001, 4446, 894, 631],
        [1001, 330, 894, 532 ],
        [1001, 1968, 894, 532],
        [70, 2513, 894, 631  ],
        [70, 4446, 894, 631  ],
        [70, 876, 894, 532   ],
        [536, 155, 428, 144  ],
        [70, 155, 428, 144   ],
        [1467, 155, 428, 144 ],
        [1001, 155, 428, 144 ],
        [1629, 111, 265, 41  ],
    ]

Out1 = sorted(L, key=itemgetter(0))

[print(v) for v in Out1]

[70, 2513, 894, 631]
[70, 4446, 894, 631]
[70, 876, 894, 532]
[70, 155, 428, 144]
[536, 155, 428, 144]
[1001, 2513, 894, 631]
[1001, 4446, 894, 631]
[1001, 330, 894, 532]
[1001, 1968, 894, 532]
[1001, 155, 428, 144]
[1467, 155, 428, 144]
[1629, 111, 265, 41]

但是如果我在第二个元素上应用相同的命令来列出 Out1,我不会得到所需的输出。

我的预期输出是这样的:

Out2 = [
        [70, 155, 428, 144    ],
        [70, 876, 894, 532    ],
        [70, 2513, 894, 631   ],
        [70, 4446, 894, 631   ],
        [536, 155, 428, 144   ],
        [1001, 155, 428, 144  ],
        [1001, 330, 894, 532  ],
        [1001, 1968, 894, 532 ],
        [1001, 2513, 894, 631 ],
        [1001, 4446, 894, 631 ],
        [1467, 155, 428, 144  ],
        [1629, 111, 265, 41   ]
    ]

我该怎么做?谢谢

Python 排序是稳定的,但仅限于与列表排序时具有相同值的元素。所以当你排序

Out2 = sorted(Out1, key=itemgetter(1))

它只保留了Out1的原始排序,其中itemgetter(1) returns相同的值(所以你会看到[70, 2513, 894, 631]排序在[1001, 2513, 894, 631]之前Out2).

要按第一个值然后按第二个值排序,您需要按相反的顺序进行排序,即

Out1 = sorted(L, key=itemgetter(1))
Out2 = sorted(Out1, key=itemgetter(0))
print(Out2)

或者,同时按两个值排序:

Out1 = sorted(L, key=itemgetter(0, 1))
print(Out1)

无论哪种情况,结果都如您所愿:

[
 [70, 155, 428, 144],
 [70, 876, 894, 532],
 [70, 2513, 894, 631],
 [70, 4446, 894, 631],
 [536, 155, 428, 144],
 [1001, 155, 428, 144],
 [1001, 330, 894, 532],
 [1001, 1968, 894, 532],
 [1001, 2513, 894, 631],
 [1001, 4446, 894, 631],
 [1467, 155, 428, 144],
 [1629, 111, 265, 41]
]