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

Python中内置类型的自定义比较功能

龙俊良
2023-03-14
问题内容

我正在使用Python的内置集来保存我定义的类的对象。对于此类,我定义了__eq____ne__和,__hash__以便可以通过自定义比较功能比较对象。这工作得很好,直到我发现我确实需要
2 套对比功能,这将在不同的方式在不同的时间在我的代码中使用。

我无法__eq__在我的类中定义两组等方法,并且Python的内置设置类型不接受比较器参数。我想我可以围绕set编写包装类,但这似乎比必要的工作多得多。

有没有比编写自己的集合类更简单的解决方案了?


问题答案:

假设您有这个课程:

class Thingy(object):
    def __init__(self, key, notkey):
        self.key, self.notkey = key, notkey
    def __eq__(self, other):
        return self.key == other.key
    def __hash__(self):
        return hash(self.key)

现在,您想将它们放在集合中,但是用notkey代替key。您不能按原样进行操作,因为set期望其元素具有相同的相等性含义-
以及对hash的一致含义(a == b总是意味着)hash(a) == hash(b)。因此,创建一个包装器:

class WrappedThingy(object):
    def __init__(self, thingy):
        self.thingy = thingy
    def __eq__(self, other):
        return self.thingy.notkey == other.thingy.notkey
    def __hash__(self):
        return hash(self.thingy.notkey)

您可以将 它们 放在集合中:

wts = set(WrappedThingy(thingy) for thingy in thingies)

例如,假设您要对自己的东西进行唯一化,为每个notkey值精确地(任意)保持一个东西。只需包装它们,将包装器粘在一个集合中,然后解开包装,然后将展开的对象粘在列表中:

wts = set(WrappedThingy(thingy) for thingy in thingies)
thingies = [wt.thingy for wt in wts]

这是更通用的Python模式“ DSU”的一部分。这代表“ decorate-sort-
undecorate”,这在当今已经非常不准确了,因为在现代Python中几乎不需要它来执行与排序相关的任务……但是从历史上看,它是有道理的。随意称其为“装饰过程无法装饰”,希望它能流行起来,但不要太过努力。

您现在不需要DSU进行排序的原因是,大多数排序函数都将key函数作为参数。实际上,即使是唯一化,配方中的unique_everseen功能也需要一个。itertoolskey

但是,如果您仔细看一下它的功能,基本上就是DSU:

for element in iterable:
    k = key(element)
    if k not in seen:
        seen.add(k)
        yield element

(事实上​​,它是一个生成器,而不是一个列表构建函数,这意味着它可以“即时取消装饰”,这使事情变得简单一些。但是除此之外,相同的想法。)



 类似资料:
  • 问题内容: 在 Python 2.x中 ,我可以将自定义函数传递给sort和.sort函数 因为在 我的 语言中,辅音是与此顺序一起出现的 但是在 Python 3.x中 ,看起来我无法传递关键字 有其他选择吗?或者我也应该编写自己的排序函数吗? 注意:我通过使用“ k”,“ kh”等进行了简化。实际字符是Unicode,甚至更复杂,有时在辅音前后都有元音,所以我完成了自定义比较功能,因此这一部分

  • 本文向大家介绍Python元类的自定义功能,包括了Python元类的自定义功能的使用技巧和注意事项,需要的朋友参考一下 示例 可以更改元类中的功能,以便每当构建一个类时,就将字符串打印到标准输出,或者引发异常。此元类将打印正在构建的类的名称。 您可以像这样使用元类: 标准输出为:            

  • 问题内容: 我想比较Java中的类类型。 我以为我可以这样做: 我想比较一下是否传递给函数的obj是从MyObject_1扩展而来的。但这是行不通的。似乎getClass()方法和.class提供了不同类型的信息。 如何比较两个类类型,而不必创建另一个伪对象来比较类类型? 问题答案: 试试这个: 由于继承,这对接口也有效: 有关instanceof的更多信息,请访问:http : //mindpr

  • 在我的PriorityQueue中,我有两种类型的客户,即VIP和常规客户。我想先为贵宾服务,再为常客服务。 如果CustomerID<100,则视为VIP。 如果客户是VIP,他会排在队列中VIP部分的最后 更新:我不想排序任何其他列除了VIP。我不想添加“日期”,因为它感觉像是一个黑客,而不是理解Java是如何工作的。

  • 本文向大家介绍Python3.x中自定义比较函数,包括了Python3.x中自定义比较函数的使用技巧和注意事项,需要的朋友参考一下 在Python3.x的世界里,cmp函数没有了。那么sorted,min,max等需要比较函数作为参数的函数该如何用呢? 以min函数的定义为例,有两种重载形式: 单参数(一个迭代器): 多参数(多个待比较内容): 本文主要讨论key=func参数的使用 。举例说明吧

  • 我试图用自定义比较器定义优先级队列,如下所示: 这就是显示的编译错误 我还尝试在测试类中声明另一个比较函数,但没有效果。为什么主函数中的优先级队列编译而类中的优先级队列不编译?为比较器定义专用类是这里唯一的工作吗?谢谢你。

  • 我一直在尝试实现RESTFul体系结构,但我完全搞不清自定义媒体类型是好是坏。 目前,我的应用程序使用Http-Link:header传递“链接”。这很好,我将其与title属性一起使用,允许服务器描述这个“动作”到底是什么,尤其是当呈现给用户时。 我感到困惑的是是否应该指定自定义mime类型。例如,我有一个用户的概念。它可能与当前资源相关联。我要编一个例子,说我有一件拍卖品。我们可能有一个用户在

  • 我创建了一个自定义比较器,可以按降序对获胜数进行排序,但我不确定它是如何工作的,有人能解释一下这是如何按降序排序的吗?