DefaultDict的替代方案

时间:2017-08-03 18:27:34

标签: python defaultdict python-2.4

不幸的是,对我来说,我需要使用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)}]

编辑: 添加使用信息。首先,我使用:

构建默认字典
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

3 个答案:

答案 0 :(得分: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]}

答案 1 :(得分:1)

defaultdict(list)对于

而言只是一点点糖
if key not in d:
   d[key] = []
d[key].append(...)

答案 2 :(得分: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