gpt4 book ai didi

python - 获取/搜索集合中元素的引用

转载 作者:行者123 更新时间:2023-12-01 04:19:12 34 4
gpt4 key购买 nike

对于自定义对象,我有一个自定义 __eq____hash__ 函数,它仅依赖于唯一的“名称”。然后将此类的对象放入一个集合中。

现在我想搜索/查找集合中的一个元素:

class Resource:
def __init__(self, name, rest)
self.name = name
# ....

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

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

s = {Resource("test", 10), Resource("test2", 20)}

然后我如何搜索带有“equality”的对象:test?作为最后的手段,我可​​以使用字典,但这会非常难看,因为“ key ”将存储在两个地方,这可能会导致困难的错误。

<小时/>

只是澄清一下:我不是在寻找“in”,而是在寻找一种返回引用的方法。

最佳答案

我同意@thefourtheye;对于您显示的示例类,dict 可能是更好的选择。如果您的用例确实需要 set,那么您可以创建一个介于 dictset 之间的特殊类:

import collections

class MySuperSpecialSet(dict, collections.MutableSet):
def __init__(self, it=[]):
for v in it:
self.add(v)

def add(self, v):
super(MySuperSpecialSet, self).__setitem__(v, v)

def discard(self, v):
try:
super(MySuperSpecialSet, self).__delitem__(v)
except Exception:
pass

# make sure some `dict` methods are hard to call by accident
__setitem__ = None
keys = iterkeys = viewkeys = None
items = iteritems = viewitems = None
values = itervalues = viewvalues = None
copy = None
fromkeys = None
popitem = None

# some MutableSet methods that should override dict methods
pop = collections.MutableSet.pop
update = collections.MutableSet.__ior__


s = MySuperSpecialSet([Resource("test", 10), Resource("test2", 20)])

test2 = Resource("test2", 2)
test2_orig = s[test2]

test2.rest == test2_orig.rest # False

为了提高效率,您需要手动实现 collections.MutableSet 中的一些方法,但是这个准系统类几乎可以完成内置 set 中的所有操作可以做一些 dict 可以做的事情(例如 __getitem__,这是您所要求的行为所需要的)。

我还建议您使散列更加独特,这样就不会与字符串发生散列冲突。像这样的事情会起作用:

class Resource(object):
def __init__(self, name, rest)
self.name = name
# ....

def _key(self):
return (type(self), self.name)

def __hash__(self):
return hash(self._key())

def __eq__(self, other):
try:
return self._key() == other._key()
except AttributeError:
return False

关于python - 获取/搜索集合中元素的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923792/

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