2012-05-29 38 views
20

有没有办法让defaultdict默认返回密钥?还是一些具有同等行为的数据结构?即,初始化字典d默认为键的Python字典?

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

后,我只看到默认的字典拿不带参数的功能,所以我不知道是否有比创建一个新的字典其他的解决方案。

+0

这是一个有点太特殊的任务。我建议你考虑继承'dict'对象/类型。 – heltonbiker

+0

我对此很感兴趣。你能说出你需要什么吗? –

回答

25

我重写的dict__missing__方法:

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

除了返回密钥之外,是否还有特定的原因存储密钥?除非我需要*知道哪些键被查询,否则我没有理由这样做。 –

+0

@JoachimSauer:通常人们会认为如果'd ['joe']'不会引发'KeyError',那么d''中的'joe'将会评估为'True'。如果我没有存储不是这种情况的密钥。 – pillmuncher

+1

但是这个解决方案使d'中的joe'评估为'False'*,除非*在*之前使用了'd ['joe']'*。所以纯粹的“只读”访问会改变* another *只读访问的结果。我不确定这有什么更好的。 –

3

您可能需要编写自己的继承自(或类似)defaultdict的类并覆盖__getitem__方法。

7

编辑:哎呀,我才意识到我在文件中的代码最初来自另一个StackOverflow的答案! https://stackoverflow.com/a/2912455/456876,去补充一下。

这是我使用的 - 这是将该密钥作为参数传递给多数民众赞成作为参数传递给初始化默认值工厂功能的defaultdict变型,而不是没有参数:

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 
+2

我实际上有些惊讶,发现'defaultdict'还没有像这样工作...... – 2012-05-29 00:41:28

+0

@pst我想它在理论上有一定的意义,这不是默认行为 - 如果你存储相同的信息在键和值,您可能会使用错误的数据类型。也就是说,我在工作中使用这个程序。 – weronika

4

如果你不想继承字典,你可以尝试使用

d.get('a', 'a') 
d.get('b', 'b') 
d.get('c', 'c') 

我认为这是为了这个目的

清晰不神奇如果你是一个狂热的干,只具有单个字符键,你可以这样做:)

d.get(*'a'*2) 
d.get(*'b'*2) 
d.get(*'c'*2)