如何将两级排序应用于嵌套列表?
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]
]
我正在尝试首先根据每个子列表的第一个元素,然后根据每个子列表的第二个元素对下面的嵌套列表进行排序。
我可以根据每个子列表的第一个元素进行排序
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]
]