【问题标题】:Python: Does a dict value pointer store its key?Python:字典值指针是否存储其键?
【发布时间】:2010-11-30 01:53:57
【问题描述】:

我想知道是否有内置的方法可以做到这一点......以这个简单的代码为例:

D = {'one': objectA(), 'two': objectB(), 'three': objectC()}
object_a = D['one']

我相信object_a只是指向第一行创建的objectA(),对字典D一无所知,但我的问题是,Python是否存储字典值的Key?如果你只有变量object_a,有没有办法获得密钥'one'(当然,不用遍历字典)?

如果没有,我可以将值 'one' 存储在 objectA() 中,但我只是好奇 Python 是否已经存储了该信息。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    我认为没有。

    考虑将单个对象添加到(大量)不同字典的情况。 Python 为您跟踪它会变得非常昂贵,对于大多数人不使用的功能来说,它会花费很多。

    【讨论】:

      【解决方案2】:

      dict 映射并非如您所描述的那样“可逆”。

      1. 密钥必须是不可变的。它必须是不可变的,以便它可以被散列以进行查找并且不会遭受自发的变化。

      2. 该值不必是不可变的,它不会被散列以便快速查找。

      如果不 (1) 创建不可变值和 (2) 使用“反转”值填充其他类型的映射 -> 键映射,您不能简单地从值返回键。

      【讨论】:

        【解决方案3】:

        如果有的话,有没有办法得到钥匙'one' 你所拥有的只是变量 object_a (不循环字典, 当然)?

        不,Python 不会对您强加这种近乎无用的冗余。如果objA 是工厂可调用的:

        d = {'zap': objA()}
        a = d['zap']
        

        b = objA()
        

        还不错

        L = [objA()]
        c = L[0]
        

        所有在abc 中都导致完全相同类型的引用,指向完全相同的对象(如果这是objA 首先给你的),没有一点浪费(两者都没有)在所述对象或任何冗余且完全假设的辅助结构中)记录“这是/曾经是列表L和/或这些索引/键处的dict d中的值”((或索引/键,因为可能有很多) )。

        【讨论】:

          【解决方案4】:

          正如其他人所说,没有内置的方法可以做到这一点,因为它占用内存并且通常不需要。

          如果没有,我可以将值“one”存储在 objectA() 中,但我只是好奇 Python 是否已经存储了该信息。

          只是想补充一点,添加一个自动执行此操作的更通用的解决方案应该很容易。例如:

          def MakeDictReversible(dict):
           for k, v in dict.iteritems():
            v.dict_key = k
          

          这个函数只是将字典中的每个对象嵌入到一个成员“dict_key”中,该成员是用于存储对象的字典键。

          当然,此代码只能运行一次(即,在共享一个对象的两个不同字典上运行此代码,该对象的“dict_key”成员将被第二个字典覆盖)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-23
            • 2012-07-31
            • 1970-01-01
            • 2019-03-01
            相关资源
            最近更新 更多