当前位置: 首页 > 面试题库 >

如何为降序值编写Python排序键函数

卫嘉谊
2023-03-14
问题内容

在Python的最新版本中,将 函数传递到sort()以前的 cmp 函数的举动,使我对某些对象执行复杂的排序变得更加棘手。

例如,我想用一组字符串平局决胜者字段对一组对象从最新到最旧进行排序。因此,我希望日期按相反的顺序排列,但字符串按其自然顺序排列。使用比较功能,我可以将日期字段与字符串字段的比较结果取反。但是,通过键功能,我需要找到某种方法来反转/反转日期或字符串。

处理数字很容易(虽然很丑)-只是从某些东西中减去它们-
但是我是否必须找到类似的日期破解方法(从另一个日期中减去它们并比较timedelta?)和字符串(…我不知道如何以与语言环境无关的方式颠倒它们的顺序)。

我知道functools.cmp_to_key()它的存在,但是它被描述为 “主要用作转换为不再支持比较功能的Python 3的程序的转换工具”
。这意味着我应该能够使用密钥方法做我想做的事情-但是怎么做?


问题答案:

缓慢但优雅的方法是创建一个具有相反顺序的值包装器:

from functools import total_ordering
@total_ordering
class ReversedOrder:
    def __init__(self, value):
        self.value = value
    def __eq__(self, other):
        return other.value == self.value
    def __lt__(self, other):
        return other.value < self.value

如果没有functools.total_ordering,则必须实施所有6个比较,例如:

import operator
class ReversedOrder:
    def __init__(self, value):
        self.value = value
for x in ['__lt__', '__le__', '__eq__', '__ne__', '__ge__', '__gt__']:
    op = getattr(operator, x)
    setattr(ReversedOrder, x, lambda self, other, op=op: op(other.value, self.value))


 类似资料:
  • 问题内容: 我想根据子键key3的值按降序对字典d进行排序。见下文: 所以最终的字典看起来像这样。 我的方法是从d形成另一个字典e,其字典键将是key3的值,然后使用reversed(sorted(e)),但是由于key3的值可以相同,因此字典e丢失了一些键及其值。说得通? 我怎样才能做到这一点?这不是经过测试的代码。我只是想了解逻辑。 问题答案: 字典没有任何固有的顺序。或者,相反,它们的固有顺

  • 我有一个HashMap与作为关键和一个值作为价值。 我的目标是通过降序值对Hashmap进行排序。应在

  • 问题内容: 如何在Java中按降序排序? 问题答案: 这是您的一种方式list: 或者,您可以实施自己的排序并消除相反的步骤: 甚至更简单地使用,因为您只需要反转:

  • (“Samsung”,(“Galaxy”,20)) (“苹果”,(“iPhone”,40)) 我需要按照内部键的字母顺序对映射进行降序排序(在这个例子中是模型名) 我到目前为止的排序是这样的: Map.EntrySet().Stream.Foreach(entry->entry.GetValue().EntrySet().Stream().Sorted(Comparator.Comparative

  • 本文向大家介绍为Python中的数值数据集编写排序算法?,包括了为Python中的数值数据集编写排序算法?的使用技巧和注意事项,需要的朋友参考一下 排序是指以特定格式排列数据。它使数据更具可读性,并且可以将数据搜索优化到很高的水平。有五种不同的排序算法。 气泡排序 合并排序 插入排序 贝壳类 选择排序 示例 这是一种基于比较的算法,其中比较每对相邻元素,如果元素顺序不正确,则将其交换。 输出结果

  • 问题内容: 我正在尝试通过降序对数据框进行排序。我在升序参数中输入了“ False”,但我的命令仍然在升序。 我的代码是: 但输出是 问题答案: 编辑:这已经过时,请参阅@Merlin的答案。 是非空 列表 ,与。您应该写: