内存有效的dicts - 从其值中获取项目的密钥

时间:2016-06-12 18:31:43

标签: python dictionary hashmap

我有一个用例,其中包含密钥和数据的东西。 我想对这些数据和数据的dict索引进行有效编码。 所以Thing是一个类,而dictionary是其实例的dict索引:

d = {}
class Thing: 
    def __init__(k,v): self.key=k; self.data=v; d[v]=self

现在我想在我的代码中将Thing对象传递给一个对象,如下所示:

thing1, thing2 = d['thing1'], d['thing2']

此解决方案有效。我可以按键索引,我可以从每个东西中检索一个键,但请注意这个解决方案冗余地存储指向键的指针,包括dict和Thing对象。

我可以实施' dict'从头开始,我可以告诉它如何从值访问密钥。因此,许多哈希方法可以避免存储指向密钥的第二个指针。

任何Python dict实现都能提供这种灵活性吗? 如果你能够断言这是不可能的,我很乐意听到它。 THX。

注意:这里重要的一点是,以后我希望将键和数据都作为单个对象处理,并指向它的单个指针,我不想堆分配一个元组来实现这一点,因为这会打败我的原来的目标。

2 个答案:

答案 0 :(得分:0)

将密钥存储在值中是很奇怪的,因为您必须拥有密钥才能获取值。

如果您不想存储它,可以使用特殊的getter函数来获取它:

def get_key_and_value(d, k):
    return (k, d[k])

obj = get_key_and_value(d, k)
print "my key is %s and value is %s" % (obj[0], obj[1])

答案 1 :(得分:0)

您还没有充分解释用例,因此我的指导不会非常准确。我假设您不想将密钥存储在值中以节省内存(正如您在示例中所示 - 然后被拒绝)?此外,您将需要一些操作来访问用于访问该值的值和密钥。

您认为价值检索功能将以某种方式访问​​原始密钥哈希,并且从那里可以以某种方式检索密钥是不正确的。 Python字典不会显示此信息。我相信你可以滚动你自己的python扩展来创建这个能力,但这听起来像很多工作(再次 - 没有理解用例,我无法准确地确定工作是否“值得”)

相反,为什么不创建自己的dict类并将代码添加到自定义方法中。像这样:

class MyDict(object):
    def __init__(self):
        self.d = dict()
    def add(self, k, v):
        self.d[k] = v
    def later(self, k):
        print("my key is %s and value is %s" % (k, self.d[k]))

如果这不是您所希望的 - 您能更详细地描述用例吗?