Python排序多个级别的列表列表以及自定义顺序

Joh*_*ohn 6 python sorting python-2.6

我有一份清单,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']
]
Run Code Online (Sandbox Code Playgroud)

我想在多个级别上订购此列表,其中一个级别是客户订单但不知道如何执行此操作.

例如,我想先按照第一个项目然后在该订单内订购,然后按第三个项目在该订单内订购,按第四个项目订购.但是我希望第一个项目按照这个特定的顺序排序/排序,而不是按字母顺序排列:

item 4.1
item 2.1
item 3.1
item 1.1
Run Code Online (Sandbox Code Playgroud)

所以最终的清单(排序后)将是:

[
['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'],
]
Run Code Online (Sandbox Code Playgroud)

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

s = sorted(my_list, key=itemgetter(0,2,3))
Run Code Online (Sandbox Code Playgroud)

但是这会按字母顺序对它们进行排序,而我不知道该怎么做是将第一列设置为按自定义顺序排序.

eum*_*iro 4

丑陋且低效,但可能有效:

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

重新订购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']]
Run Code Online (Sandbox Code Playgroud)

如果您想以自定义方式按第一列排序,然后按字母顺序按第三列和第四列排序,只需展开key

my_list.sort(key=lambda x: (order.index(x[0]), x[2], x[3]))
Run Code Online (Sandbox Code Playgroud)

返回

[['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']]
Run Code Online (Sandbox Code Playgroud)