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 to share
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 to share