Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
默认为键的Python字典?_Python_Dictionary_Defaultdict - Fatal编程技术网

默认为键的Python字典?

默认为键的Python字典?,python,dictionary,defaultdict,Python,Dictionary,Defaultdict,有没有办法让defaultdict在默认情况下返回密钥?或者一些具有等效行为的数据结构?即,在初始化字典d之后 >>> d['a'] = 1 >>> d['a'] 1 >>> d['b'] 'b' >>> d['c'] 'c' 我只见过默认字典使用不带参数的函数,所以我不确定除了创建一种新的字典之外是否还有其他解决方案。您可能需要编写自己的类,该类继承自(或类似于)defaultdict并重写\uuuu getitem\u

有没有办法让defaultdict在默认情况下返回密钥?或者一些具有等效行为的数据结构?即,在初始化字典
d
之后

>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'

我只见过默认字典使用不带参数的函数,所以我不确定除了创建一种新的字典之外是否还有其他解决方案。

您可能需要编写自己的类,该类继承自(或类似于)
defaultdict
并重写
\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuu
方法。

我将重写
dict
\uuuuuuuuuuuuuuuuuuuuu缺少的方法:

>>> class MyDefaultDict(dict):
...     def __missing__(self, key):
...         self[key] = key
...         return key
...
>>> d = MyDefaultDict()
>>> d['joe']
'joe'
>>> d
{'joe': 'joe'}

Edit:Oops,我刚刚意识到我文件中的代码最初来自另一个stackoverflow答案,去投那个吧

这就是我使用的-它是一个defaultdict变量,将键作为参数传递给默认值工厂函数,该函数作为参数传递给init,而不是无参数:

class keybased_defaultdict(defaultdict):
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        else:
            value = self[key] = self.default_factory(key)
            return value
这是您想要的用途:

>>> d = keybased_defaultdict(lambda x: x)
>>> d[1]
1
>>> d['a']
'a'
其他可能性:

>>> d = keybased_defaultdict(lambda x: len(x))
>>> d['a']
1
>>> d['abc']
3

如果不想将dict子类化,可以尝试使用

d.get('a', 'a')
d.get('b', 'b')
d.get('c', 'c')
我认为这一点更清楚,也不那么神奇

如果您是一个干性狂热者,并且只有单字符密钥,您可以这样做:)


这是一项有点过于专业化的任务。我建议你考虑子类的“DICT”对象/类型。我对此感到好奇。你能告诉我你需要它做什么吗?事实上,我有点惊讶地发现,
defaultdict
并没有像这样工作…@pst我想这在理论上是有意义的,这不是默认行为-如果你在键和值中存储相同的信息,你可能使用了错误的数据类型。也就是说,我在工作中的程序中确实使用了这个。除了返回密钥之外,还有什么特殊的原因来存储密钥吗?除非我需要知道查询了哪些键,否则我认为没有理由这样做。@JoachimSauer:通常情况下,如果
d['joe']
没有引发
KeyError
,那么
'joe'在d
中计算为
True
。如果我没有存储密钥,情况就不会是这样。但是这个解决方案使得d中的
'joe
计算为
False
,除非您以前使用了
d['joe']
。因此,纯“只读”访问会更改另一个只读访问的结果。我不确定这是否更好。@JoachimSauer:你说得对,但是存储密钥与
collections.defaultdict
的工作方式是一致的。
d.get(*'a'*2)
d.get(*'b'*2)
d.get(*'c'*2)