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

sol*_*tus 0 python sorting lambda list python-2.7

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

第一部分很容易实现

given_list.sort(key=dots,reverse=True)
Run Code Online (Sandbox Code Playgroud)

点函数已实现并且工作正常。

这就是我陷入困境的地方,因为如果点的数量相等,我无法根据长度对已排序的列表进行排序。

这让我认为我应该以某种方式使用 lambda 自定义关键参数,但它并没有真正按预期工作,但在嵌套列表或字典的情况下却可以。

我该如何完成这件事?

mu *_*u 無 5

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

在本例中,我使用 a 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']
Run Code Online (Sandbox Code Playgroud)

由于您正在使用.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']
Run Code Online (Sandbox Code Playgroud)