使用两个键对列表进行排序

时间:2015-02-13 11:43:31

标签: python list python-2.7 sorting lambda

我有一个字符串列表,我想根据给定字符串中的点数(。)进行排序,如果这些字符串中的点数相等,我希望它们按长度排序。(两者都在降序不应该是一个问题)

第一部分可以轻松实施

given_list.sort(key=dots,reverse=True)

点功能已实现且工作正常。

这是我被卡住的地方,因为如果点数相等,我无法根据它们的长度对已经排序的列表进行排序。

这让我觉得我应该以某种方式使用lambda来定制关键参数,但它并没有真正起作用,但它确实适用于嵌套列表或字典。

我该如何完成这项工作?

1 个答案:

答案 0 :(得分:4)

您可以将自定义lambda函数作为排序键传递给已排序的方法。

在这种情况下,我使用lambda x: (x.count("."), len(x)),它将创建一个计数和长度的复合键,并相应地排序:

>>> given_list = ["e.x.a", "m.p.l.e", "ex.am.ple"]
>>> sorted(given_list, key=lambda x: (x.count("."), len(x)))
['e.x.a', 'ex.am.ple', 'm.p.l.e']
>>> sorted(given_list, key=lambda x: (x.count("."), len(x)), reverse=True)
['m.p.l.e', 'ex.am.ple', 'e.x.a']

由于您使用的是.sort,因此您也可以在此处对列表进行排序:

>>> given_list = ["e.x.a", "m.p.l.e", "ex.am.ple"]
>>> given_list.sort(key=lambda x: (x.count("."), len(x)), reverse=True)
>>> given_list
['m.p.l.e', 'ex.am.ple', 'e.x.a']