创建一个 defaultdict who's key 指的是与 key 相同的数值

Create a defaultdict who's key refers to the same numerical value as the key

我想创建一个defaultdict谁的键自动引用一个整数或等值的浮点数

即行为将是:

In [1]: selfkey = defaultdict(something)

In [2]: selfkey[4]
Out[2]: 4

In [3]: selfkey[800]
Out[3]: 800

我不确定这是否可行,我也不确定这是否是同一个问题: Is there a clever way to pass the key to defaultdict's default_factory?

^我不明白这个措辞是否与我正在寻找的内容相同。

我认为会有某种递归答案,但我没有运气尝试实现一个可以获取引用自身的值的 lambda 函数。

我得到的最接近的是引用字典本身的键,但是当你传递第二个值时它会自行扩展:

In [50]: t = defaultdict(lambda: t.keys())

In [51]: t[4]
Out[51]: dict_keys([4])

In [52]: t[5]
Out[52]: dict_keys([4, 5])

有什么想法吗?

使用 Is there a clever way to pass the key to defaultdict's default_factory? 中提出的解决方案。

from collections import defaultdict

class keydefaultdict(defaultdict):
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError( key )
        else:
            ret = self[key] = self.default_factory(key)
            return ret

d = keydefaultdict(lambda key: key)
print(d[4])
print(d[5])

这输出

4
5

您可以创建自己的字典 class 并像这样修改 __getitem__ 方法:

class mydict(dict):
    def __getitem__(self, x):
        if x not in self:
            return x
        else:
            return super().__getitem__(x)

此 class 具有您想要的行为

>>> d = mydict()
>>> d[3]
3
>>> d[1.1]
1.1
>>> d[5] = -2
>>> d[5]
-2

编辑:如果你想要 defaultdict 将丢失的键添加到字典的行为,你可以这样做:

class mydict(dict):
    def __getitem__(self, x):
        if x not in self:
            self[x] = x
            return x
        else:
            return super().__getitem__(x)