我有一个复杂的数据结构,本质上是一个dict,其中键是散列实例。如果我只知道等于键的散列值,我该如何取回实例?我可以通过暴力来做到这一点,但似乎我应该能够在O(1)时间内获得密钥/实例。
class Test:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
self.arr = ["extra"]
def __str__(self):
return self.foo + self.bar
def __hash__(self):
return hash(str(self))
def __eq__(self, other):
return hash(self) == hash(other)
my_thing = Test("FOO", "BAR")
my_dict = dict()
my_dict[my_thing] = 1
for k, v in my_dict.iteritems():
if k == "FOOBAR":
print k.arr
编辑:我希望能够在实例中获取可变数据(在本例中为数组)。因此,如果我只知道"FOOBAR"
的哈希值,我希望能够得到["extra"]
,而不必遍历整个字典匹配键(底部的for循环)
答案 0 :(得分:0)
dict应将键(foo,bar)映射到要检索的数据。以下是实现此目的的一种方法:
class Test(object):
...
def key(self):
return (self.foo, self.bar)
my_thing = Test("FOO", "BAR")
my_dict = {}
my_dict[my_thing.key()] = my_thing
print my_dict[("FOO", "BAR")].arr
请注意,我修改了您的键功能以避免碰撞,如:
Test("FOO", "BAR") == Test("FOOB", "AR")
答案 1 :(得分:0)
听起来你有字符串“FOOBAR”(例如),你想在你的dict中检索k
的一个键str(k) == "FOOBAR"
。
执行此操作的一种方法是重新构建一个新的Test对象,该对象具有相同的字符串表示形式并将其用于查找:
my_thing = my_dict(Test("FOO", "BAR"))
但这效率很低,并且会在对象创建和字符串表示之间创建依赖关系。
如果此字符串表示形式具有其自己的内在值作为键,则可以通过字符串来维护您的字典(或其他字典):
my_index = dict()
my_index[str(my_thing)] = my_thing
这样,您只能在字符串中查找您的值:
print my_index["FOOBAR"].arr