Python按多个层级和自定义顺序排序列表中的列表

6 投票
1 回答
2772 浏览
提问于 2025-04-17 17:27

我有一个列表,里面又包含了很多小列表,叫做 my_list,比如说:

[
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'],
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'],
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'],
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'],
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'],
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'],
['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'],
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5']
]

我想按照多个层级来排序这个列表,其中一个层级是按照客户的顺序来排,但我不知道该怎么做。

比如说,我想先按照第一个项目排序,然后在这个顺序里再按照第三个项目排序,再在这个顺序里按照第四个项目排序。不过,我希望第一个项目的排序是按照我指定的顺序,而不是字母顺序:

item 4.1
item 2.1
item 3.1
item 1.1

所以最后排序后的列表应该是:

[
['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5']
['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'],
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'],
['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'],
['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'],
['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'],
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'],
['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5'],
]

我知道可以通过以下方式进行多层级排序:

s = sorted(my_list, key=itemgetter(0,2,3))

但是这样会把所有的内容都按字母顺序排,而我不知道怎么设置第一个列按照我自定义的顺序来排序。

1 个回答

4

虽然这个方法看起来很丑陋而且效率不高,但可能是有效的:

order = ['item 4.1', 'item 2.1', 'item 3.1', 'item 1.1']
my_list.sort(key=lambda x: order.index(x[0]))

这个代码会重新排列 my_list 成为:

[['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'],
 ['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'],
 ['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'],
 ['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'],
 ['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'],
 ['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'],
 ['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'],
 ['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5']]

如果你想按照第一列的自定义方式排序,然后再按第三列和第四列的字母顺序排序,只需要扩展 key 的部分:

my_list.sort(key=lambda x: (order.index(x[0]), x[2], x[3]))

这样就会返回:

[['item 4.1', 'item 4.2', 'item 4.3', 'item 4.4', 'item 4.5'],
 ['item 2.1', 'item 2.2', 'item 2.3', 'item 2.4', 'item 2.5'],
 ['item 3.1', 'item 2.2', 'item 2.4', 'item 2.7', 'item 2.5'],
 ['item 3.1', 'item 3.2', 'item 3.2', 'item 3.2', 'item 3.2'],
 ['item 3.1', 'item 3.2', 'item 3.2', 'item 3.6', 'item 3.2'],
 ['item 3.1', 'item 3.2', 'item 3.3', 'item 3.4', 'item 3.5'],
 ['item 1.1', 'item 1.2', 'item 1.3', 'item 1.4', 'item 1.5'],
 ['item 1.1', 'item 1.2', 'item 1.3', 'item 1.5', 'item 1.5']]

撰写回答