我想知道是否有内置的方法来执行此操作...例如,使用这个简单的代码:
D = {'one': objectA(), 'two': objectB(), 'three': objectC()}
object_a = D['one']
我相信object_a
只是指向第一行创建的objectA()
,对字典D
一无所知,但我的问题是,Python存储了密钥吗?字典价值?有没有办法获得密钥'one'
如果您拥有的是变量object_a
(当然没有循环遍历字典)?
如果没有,我可以在'one'
内存储值objectA()
,但我很好奇Python是否已存储该信息。
答案 0 :(得分:7)
我认为没有。
考虑将单个对象添加到(大量)不同字典的情况。 Python为你追踪它会变得非常昂贵,对于大多数人没有使用的功能来说会花费很多。
答案 1 :(得分:3)
dict
映射并非如您所描述的那样“可逆”。
密钥必须是不可变的。它必须是不可变的,以便它可以进行散列以便查找,而不会遭受自发的变化。
该值不必是不可变的,不进行哈希以便快速查找。
如果没有(1)创建不可变值,并且(2)使用“反转”值填充其他类型的映射,则不能简单地从值返回密钥 - >键映射。
答案 2 :(得分:2)
有没有办法让钥匙'一'如果 你所拥有的只是变量object_a (没有循环字典, 当然)?
不,Python没有给你带来这种近乎无用的冗余。如果objA
是工厂可调用的:
d = {'zap': objA()}
a = d['zap']
和
b = objA()
和
一样L = [objA()]
c = L[0]
所有与a
,b
和c
完全相同的引用都会产生完全相同的对象(如果这是objA
首先给出的内容),没有一点浪费(既不在所述对象中也不在任何冗余和完全假设的辅助结构中)来记录“这是/列表L中的值和/或这些索引/键上的字典”((或索引/键)因为cource可能有很多))。
答案 3 :(得分:0)
就像其他人所说的那样,没有内置的方法可以做到这一点,因为它占用了内存并且通常不需要。
如果没有,我可以在objectA()中存储值'one',但我只是好奇Python是否已存储该信息。
只是想补充一点,添加更通用的解决方案应该很容易实现。例如:
def MakeDictReversible(dict):
for k, v in dict.iteritems():
v.dict_key = k
这个函数只是用字符“dict_key”嵌入字典中的每个对象,这是用于存储对象的字典键。
当然,这段代码只能工作一次(即,在共享一个对象的两个不同的字典上运行它,并且第二个字典会覆盖对象的“dict_key”成员)。