获取作为实例的字典键

时间:2017-02-24 21:46:37

标签: python class dictionary

我有一个复杂的数据结构,本质上是一个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循环)

2 个答案:

答案 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