2017-08-03 184 views
3

不幸的是,对于我来说,我需要向后兼容w/Python 2.4,并且defaultdict在2.4版本中不存在。DefaultDict的替代方案

什么可以替代它?

对于给定的关键数据结构的列表:

[{'red': (12, 1, 12), 'white': (30, 2, 60), 'blue': (8, 1, 4), 'orange': (9, 4, 8), 'black': (10, 12, 4)}] 

编辑: 添加使用信息。首先,我建立与默认的字典:

defDict[key1].append(... ...) 

那么它是通过几种方法为关键:VAL(名单)查找和密钥删除。

具体为删除:

 if len(defDict[key1][0]) == 0: 
      del defDict[key1] 

编辑:错误的NoneType

 print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
     print defDict[key] 
     print "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" 
     if len(defDict[key][0]) == 0: 
      #del defDict[key] 

错误:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
None 
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 
if len(defDict[key][0]) == 0: 
TypeError: 'NoneType' object has no attribute '__getitem__' 

我认为错误来自key

 print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
     print defDict[key] 
     print "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" 

输出:

 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
     None 
     yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 
+2

取决于你用它做什么。 'get',''setdefault'或明确的'in'检查是通常的选择。 – user2357112

+0

@ user2357112谢谢。我编辑了这个问题。首先我构建字典,然后通过一些方法调用它。 –

+0

期望的输出是什么? –

回答

5

一个不错位,您可以实现自己的defaultdict在一个非常简单的方式。

def defaultdict(default_type): 
    class DefaultDict(dict): 
     def __getitem__(self, key): 
      if key not in self: 
       dict.__setitem__(self, key, default_type()) 
      return dict.__getitem__(self, key) 
    return DefaultDict() 


list_dict = defaultdict(list) 
list_dict['a'].append(1) 
print list_dict # {'a': [1]} 
+0

只有有效的答案。 –

1

defaultdict(list)是糖作为

if key not in d: 
    d[key] = [] 
d[key].append(...) 
+0

你可以存储一个列表作为字典值吗? –

+0

确实。这就是'defaultdict(list)'在底层做的事情。 – thaavik

+0

有趣,我会试一试,让你知道。 –

0

很简单写一个补丁包,对defaultdict

class defaultdict(dict): 
    def __init__(self, default_factory, *args, **kw): 
     dict.__init__(self, *args, **kw) 
     self.default_factory = default_factory 

    def __getitem__(self, key): 
     try: 
      return dict.__getitem__(self, key) 
     except KeyError: 
      result = self.default_factory() 
      self[key] = result 
      return result 
+0

谢谢你的回复。这是否支持删除项目? –

+0

它的行为在很大程度上与Python 2.6的'defaultdict'完全相同。 – Daniel

+0

是的,但它不会删除一个键...... –