+-
支持元组和列表的Python排序键功能
例如,在 Python中,您可以对元组sorted([(2,2),(1,2,2,(2,1),(1,1)])进行排序,并获得[(1,1),(1,2) ,(2,1),(2,2)].

您还可以使用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排序键功能 - 乐贴网