Alternatives to DefaultDict

Unfortunately for me, I need to do a script backwards compatible w / Python 2.4 and defaultdict

doesn't exist in 2.4.

What could be the alternative for this?

The data structure for a given key is a list:

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

      

EDIT: Adding usage information. First, I create a default default:

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

      

Then it passed several methods to find keys: val (list) and delete keys.

In particular, to remove:

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

      

EDIT: error in NoneType

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

      

Mistake:

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

      

I think the error is coming from key

:

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

      

Output:

       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
       None
       yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

      

+3


source to share


3 answers


You can implement your own in a defaultdict

fairly simple way.



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]}

      

+5


source


defaultdict(list)

is just a nice piece of sugar for



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

      

+1


source


Just write a backport for 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


source







All Articles