Python:从dict中,如何检索对象作为键

2024-04-19 23:38:48 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个包含多个Object:value,的字典,我如何使用它作为[key]来检索某些对象?在

例如

class Obj():
    def __init__(self, value):
        self.value = value

dct = {Obj(foo):foo_value, Obj(bar):bar_value}

#How to do something like
#>>> dct[foo]
#foo_value

假设foo_值不能被指定为Obj的属性。在

到目前为止,这是我得到的(抽象)

^{pr2}$

以及输出

dict_keys([item1, item2])
Traceback (most recent call last):
    File "C:\Users\ivan\Desktop\multi_e.py", line 197, in <module>
     dct['item1']
KeyError: 'item1'

Tags: 对象keyselfobj字典objectfooinit
3条回答

使用dict的自定义实现如何?在

class FieldDict(dict):
    def __getitem__(self, item):
        return dict.__getitem__(self, Obj(item))

dct = FieldDict({Obj('item1'):1, Obj('item2'):2})

print(dct.keys())
print(dct['item1'])  # prints 1

这将不起作用,因为键不是字符串,但它们是Obj类型的对象。即使所有的物体都有那根弦 你可以这么做。将变量作为对对象的引用存储为键

x = Obj("item1")
y = Obj("item2")
dct= {x:1, y:2}

要找回你需要做的事:

^{pr2}$

您可以使用自定义的__getitem____setitem__推出自己的dict子类,实际上在您的Obj类上不需要任何复杂的__hash__方法,只要__init__就足够了。在

class Obj:
    def __init__(self, value):
        self.name = value

class MyDict(dict):
    def __setitem__(self, key, value):
        if isinstance(key, Obj):
            dict.__setitem__(self, key.name, value)
        else:
            dict.__setitem__(self, key, value)

    def __getitem__(self, key):
        if isinstance(key, Obj):
            return dict.__getitem__(self, key.name)
        return dict.__getitem__(self, key)

演示:

^{pr2}$

相关问题 更多 >