【问题标题】:Getting a dictionary key that is an instance获取作为实例的字典键
【发布时间】:2017-07-15 21:19:28
【问题描述】:

我有一个复杂的数据结构,本质上是一个字典,其中的键是散列实例。如果我只知道等于键的散列值,我怎样才能取回实例?我可以通过蛮力做到这一点,但似乎我应该能够在 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 循环)

【问题讨论】:

  • def __eq__(self, other): return hash(self) == hash(other) 这很糟糕:哈希冲突怎么办?
  • 所以要再次获取my_thing
  • 那绝对不会是真的if k == "FOOBAR": 你的意思是if str(k) == "FOOBAR": 对吧?
  • 字典并不是为了让您在 O(1) 时间内从一个值(无论如何这必然是模棱两可的)中获取对应的键。
  • 我认为 OP 认为字典只存储哈希作为它的键。如果你这样做print(type(k)),你会发现这不是真的。

标签: python class dictionary


【解决方案1】:

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")

【讨论】:

    【解决方案2】:

    听起来您有字符串“FOOBAR”(例如),并且您想在您的 dict 中检索一个键 k,其中 str(k) == "FOOBAR"

    一种方法是重建一个新的 Test 对象,该对象将具有相同的字符串表示并将其用于查找:

    my_thing = my_dict(Test("FOO", "BAR"))
    

    但这效率低下,并且会在对象创建和您的字符串表示之间产生依赖关系。

    如果这个字符串表示有它自己作为键的内在价值,你可以只维护你的 dict(或另一个 dict)以字符串为键:

    my_index = dict()
    my_index[str(my_thing)] = my_thing
    

    这样,您可以仅在给定字符串的情况下查找您的值:

    print my_index["FOOBAR"].arr
    

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 2012-03-03
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多