
您还可以使用sorted([x,y,z],key = custom_key)的自定义键函数来实现特殊的排序条件.
例如:
medals_map = {'Gold': 1, 'Silver': 2, 'Bronze': 3 }
def custom_key(item):
if isinstance(item, basestring):
try:
return medals_map[item]
except KeyError:
pass
return item
可以正常排序任何字符串列表,也可以根据我的自定义排序对金/银/青铜进行排序.
但是它不再“正确地”处理元组:sorted([(‘Gold’,2),(‘Bronze’,1),(‘Gold’,1)],key = custom_key)结果为[(‘Bronze’ ,1),(‘Gold’,1),(‘Gold’,2)],因为item不是基本字符串.
但是我想通过以某种方式将自定义逻辑应用于元组中的每个项来获得[(‘Gold’,1),(”Gold’,2),(‘Bronze’,1)].
像默认键功能一样,将自定义键逻辑“映射”到列表中任何元组(可能显示或可能不显示)的最佳方法是什么?
编辑:更多示例:
>排序([[Silver],“ Bronze”,“ Gold”],key = custom_key)
> [“金”,“银”,“铜牌”]
>排序([[[‘Silver’,2],[‘Silver’,1],[‘Gold’,1]],key = custom_key)
> [[‘金’,1],[‘银’,1],[‘银’,2]]
>排序([[(2,’Gold’),(2,’Bronze’),(1,’Gold’)],key = custom_key)
> [((1,’Gold’),(2,’Gold’),(2,’Bronze’)]
>排序([(‘Silver’,’Bronze’),(‘Gold’,’Bronze’),(‘Silver’,’Gold’)],key = custom_key)
> [[(‘Gold’,’Bronze’),(‘Silver’,’Gold’),(‘Silver’,’Bronze’)]
from collections import Iterable
def custom_key(item):
if isinstance(item, Iterable) and not isinstance(item, basestring):
return [medals_map.get(ele, ele) for ele in item]
return medals_map.get(item, item)
输出:
In [2]: assert sorted(['Silver', 'Bronze', 'Gold'], key=custom_key) == ['Gold', 'Silver', 'Bronze']
In [3]: assert sorted([['Silver', 2], ['Silver', 1], ['Gold', 1]], key=custom_key) == [['Gold', 1], ['Silver', 1], ['Silver', 2]]
In [4]: assert sorted([(2, 'Gold'), (2, 'Bronze'), (1, 'Gold')], key=custom_key) == [(1, 'Gold'), (2, 'Gold'), (2, 'Bronze')]
In [5]: assert sorted([('Silver', 'Bronze'), ('Gold', 'Bronze'), ('Silver', 'Gold')], key=custom_key) == [('Gold', 'Bronze'), ('Silver', 'Gold'), ('Silver', 'Bronze')]
转载注明原文:支持元组和列表的Python排序键功能 - 乐贴网