使用两个键对列表进行排序
Sorting a list using two keys
我有一个字符串列表,我想根据给定字符串中的点数 (.) 进行排序,如果这些字符串中的点数相等,我希望它们按长度排序。(无论如何都按降序排列应该不是问题)
第一部分很容易实现
given_list.sort(key=dots,reverse=True)
点功能已实现,效果很好。
这是我卡住的地方,因为如果点数相等,我无法根据它们的长度对已排序的列表进行排序。
这让我觉得我应该以某种方式使用 lambda 自定义关键参数,但它并没有真正发挥作用,但在嵌套列表或字典的情况下确实如此。
我该如何完成?
您可以将自定义lambda 函数作为排序键传递给sorted 方法。
在这种情况下,我使用 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']
我有一个字符串列表,我想根据给定字符串中的点数 (.) 进行排序,如果这些字符串中的点数相等,我希望它们按长度排序。(无论如何都按降序排列应该不是问题)
第一部分很容易实现
given_list.sort(key=dots,reverse=True)
点功能已实现,效果很好。
这是我卡住的地方,因为如果点数相等,我无法根据它们的长度对已排序的列表进行排序。
这让我觉得我应该以某种方式使用 lambda 自定义关键参数,但它并没有真正发挥作用,但在嵌套列表或字典的情况下确实如此。
我该如何完成?
您可以将自定义lambda 函数作为排序键传递给sorted 方法。
在这种情况下,我使用 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']