-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflat.py
More file actions
48 lines (31 loc) · 976 Bytes
/
flat.py
File metadata and controls
48 lines (31 loc) · 976 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from collections import defaultdict
class NestedDict(defaultdict):
"""defaultdict of defaultdicts. Behold the meta!"""
def __init__(self):
defaultdict.__init__(self, NestedDict)
def to_dict(self):
return dict(
(k, v.to_dict() if isinstance(v, NestedDict) else v)
for k, v, in self.iteritems()
)
def unflatten(flat):
nested = NestedDict()
for k, v in flat.iteritems():
parts = k.split('.')
level = nested
# Climb up to the right level
for part in parts[:-1]:
level = level[part]
level[parts[-1]] = v
return nested.to_dict()
def is_dict(value):
return hasattr(value, '__getitem__')
def flatten(nested, _levels=()):
flat = {}
for k, v in nested.iteritems():
levels = _levels + (k,)
if is_dict(v):
flat.update(flatten(v, levels))
else:
flat['.'.join(levels)] = v
return flat