2017-08-03 185 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

是的,但它不會刪除一個鍵...... –