问题描述
我有一个清单清单。每个列表都包含一个描述词,一个单词或句子,然后是一个排序列表。
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]]]