python扁平化词典

Python 将词典扁平化,

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 原始数据
data = {
'a':1,
'b':{
'c1': 2,
'c2':{
'd2':{
'e':3,
'f':4
}
}
}
}

# 转换后
flat_data = {
'a': 1,
'b.c1': 2,
'b.c2.d2.e': 3,
'b.c2.d2.f': 4
}

主要思路是迭代,这里给出两种实现方法。

使用生成器 yield

1
2
3
4
5
6
7
8
9
10
def flatten(d):
def _flatten(d, prefix=None):
for k,v in d.items():
full_key = k if prefix is None else prefix + '.' + k
if isinstance(v, dict):
# yield from 可以逐个返回递归调用中的结果
yield from _flatten(v, full_key)
else:
yield full_key,v
return {k:v for k,v in _flatten(d)}

合并迭代返回值

1
2
3
4
5
6
7
8
9
10
11
def flatten(d, prefix=None):
items = {}
for k,v in d.items():
full_key = k if prefix is None else prefix + '.' + k
if isinstance(v, dict):
# 通过 dict 的 update 方法合并子递归返回内容
sub_items = flatten(v, full_key)
items.update(sub_items)
else:
items[full_key] = v
return items