gpt4 book ai didi

Python字典键(类对象)与多个比较器的比较

转载 作者:太空狗 更新时间:2023-10-30 00:08:07 25 4
gpt4 key购买 nike

我使用自定义对象作为 python 字典中的键。这些对象定义了一些默认的 hasheq 方法,用于默认比较但是在某些功能中我需要使用不同的方式来比较这些对象。那么有什么方法可以覆盖或传递一个新的比较器来仅针对此特定功能进行这些键比较。

更新:我的类有以下类型的功能(这里我不能编辑hash方法,它会在其他地方影响很多)

class test(object):

def __init__(self,name,city):
self.name=name
self.city=city

def __eq__(self,other):
hash_equality= (self.name==other.name)
if(not hash_equality):
#check with lower
return (self.name.lower()==other.name.lower())


def __hash__(self):
return self.name.__hash__()

my_dict={}
a=test("a","city1")
my_dict[a]="obj1"
b=test("a","city2")
print b in my_dict #prints true
c=test("A","city1")
print c in my_dict #prints false
print c in my_dict.keys() #prints true
# my_dict[c] throw error

这是正常功能。但是在一种特定的方法中,我想覆盖/或传递一个新的自定义比较器,其中新的 hash 代码就像

def  __hash__(self):
return self.name.lower().__hash__()

这样 c in my_dict 返回 ture

my_dict[c] 将返回“obj1”

抱歉有这么多更新。

就像排序一样,我们可以将自定义方法作为比较器传递,这里有什么方法可以做到这一点。

最佳答案

完成这项工作的唯一方法是使用新的散列和比较函数创建字典的副本。原因是字典需要使用新的散列函数重新散列每个存储的键,以使查找工作如您所愿。由于您无法为字典提供自定义哈希函数(它始终使用其中一个关键对象),因此最好的办法可能是将对象包装在使用自定义哈希和比较函数的类型中。

class WrapKey(object):
__init__(self, wrapee):
self._wrapee = wrapee

__hash__(self):
return self._wrapee.name.lower().__hash__()

__eq__(self, other):
return self._wrapee.name == other._wrapee.name


def func(d):
d_copy = dict((WrapKey(key), value) for key, value in d.iteritems())
# d_copy will now ignore case

关于Python字典键(类对象)与多个比较器的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9835668/

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