如何基于每个子列表中的对象对子列表进行排序

问题描述

我有一个清单清单。每个列表都包含一个描述词,一个单词或句子,然后是一个排序列表。

eg_list = [['sent','this is a sentence',[6,1,3]]
           ['word','abú',[5,2,9.5]]
           ['word','because',11]]
           ['sent','this is not just one word',1]]
           ['word','ol',8]]
           ['word','magisteriums',14]]]

我想基于每个子列表末尾的排序列表中的数字对子列表进行排序。我需要它首先按排序列表中的第一个排序,然后按中间的数字排序,然后按最后一个排序,以便排序后的结果应如下所示:

['word',14]]
['word',8]]
['word',9.5]]
['word',11]]
['sent',1]]
['sent',3]]

我可以将哪种键放入Python sorted()函数中以这种方式进行排序?

解决方法

因为您要从左至右比较排序列表及其元素,这是python在列表之间进行比较的普通顺序,所以您要做的就是提供一个提取排序列表本身的关键函数-这可以使用lambda完成,如下所示(尽管operator.itemgetter(2)可以替代)。无需在排序列表中显式引用元素。

要提取排序列表,下面的示例在lambda(即第3个元素)中使用lst[2],但也可以使用lst[-1](即最后一个元素)。

from pprint import pprint  # pprint used for output display only

eg_list = [['sent','this is a sentence',[6,1,3]],['word','abú',[5,2,9.5]],'because',11]],['sent','this is not just one word',1]],'ol',8]],'magisteriums',14]]]

pprint(sorted(eg_list,key=lambda lst:lst[2]))

这给出了:

[['word',14]],3]]]

更新-您还询问了(在注释中)如果要以不同顺序使用排序列表中的元素,该怎么做。在这种情况下,您需要做的是编写一个关键函数,该函数使用所需的顺序构建一个新的排序列表或元组。尽管可以将其压缩为单行,但是为它编写一个显式函数可能更方便。例如,要按中,左,右顺序排序,可以使用:

def get_key(lst):
    o_lst = lst[2]
    # let's return a tuple,although list would also work
    return (o_lst[1],o_lst[0],o_lst[2])  

然后您将使用key=get_key进行排序。

等效的单线将使用:

key=lambda lst:(lst[2][1],lst[2][0],lst[2][2])

但是重复lst[2]使得此操作不太可取。

无论哪种情况,您都会得到:

[['word',11]]]