gpt4 book ai didi

支持元组和列表的Python排序键函数

转载 作者:行者123 更新时间:2023-11-28 22:41:41 26 4
gpt4 key购买 nike

例如,在 Python 中,您可以对元组进行排序 sorted([(2,2),(1,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)] 因为项目不是 basestring .

但我想通过以某种方式将自定义逻辑应用于每个项目来获得 [('Gold', 1), ('Gold', 2), ('Bronze', 1)]在元组中。

像默认键函数那样,将自定义键逻辑“映射”到列表中的任何元组(可能出现也可能不出现)的最佳方式是什么?


编辑:更多例子:

  • sorted(['Silver', 'Bronze', 'Gold'], key=custom_key)
    • ['金牌', '银牌', '铜牌']
  • sorted([['Silver', 2], ['Silver', 1], ['Gold', 1]], key=custom_key)
    • [['Gold', 1], ['Silver', 1], ['Silver', 2]]
  • sorted([(2, 'Gold'), (2, 'Bronze'), (1, 'Gold')], key=custom_key)
    • [(1, 'Gold'), (2, 'Gold'), (2, 'Bronze')]
  • sorted([('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排序键函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32351508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com