DefaultDict的替代方案

Sim*_*_me 3 python python-2.4 defaultdict

不幸的是,对我来说,我需要使脚本向后兼容w/Python 2.4,并且defaultdict在2.4版本中不存在.

什么可以替代呢?

给定键的数据结构是以下列表:

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

编辑:添加使用信息.首先,我用以下内容构建默认dict:

defDict[key1].append(... ...)
Run Code Online (Sandbox Code Playgroud)

然后它传递给密钥的几种方法:val(列表)查找和密钥删除.

特别是删除:

        if len(defDict[key1][0]) == 0:
            del defDict[key1]
Run Code Online (Sandbox Code Playgroud)

编辑:NoneType上的错误

        print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        print defDict[key]
        print "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
        if len(defDict[key][0]) == 0:
            #del defDict[key]
Run Code Online (Sandbox Code Playgroud)

错误:

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

我认为错误来自key:

        print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        print defDict[key]
        print "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
Run Code Online (Sandbox Code Playgroud)

输出:

       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
       None
       yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Run Code Online (Sandbox Code Playgroud)

Jar*_*uen 6

您可以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]}
Run Code Online (Sandbox Code Playgroud)