首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拼合嵌套词典,压缩关键字

拼合嵌套词典,压缩关键字
EN

Stack Overflow用户
提问于 2011-05-17 15:23:02
回答 29查看 203.8K关注 0票数 232

假设你有一个字典,比如:

代码语言:javascript
复制
{'a': 1,
 'c': {'a': 2,
       'b': {'x': 5,
             'y' : 10}},
 'd': [1, 2, 3]}

你将如何将其扁平化成如下所示:

代码语言:javascript
复制
{'a': 1,
 'c_a': 2,
 'c_b_x': 5,
 'c_b_y': 10,
 'd': [1, 2, 3]}
EN

回答 29

Stack Overflow用户

发布于 2011-05-17 15:30:18

基本上,与扁平化嵌套列表的方式相同,您只需做额外的工作,即按键/值迭代字典,为新字典创建新键,并在最后一步创建字典。

代码语言:javascript
复制
import collections

def flatten(d, parent_key='', sep='_'):
    items = []
    for k, v in d.items():
        new_key = parent_key + sep + k if parent_key else k
        if isinstance(v, collections.MutableMapping):
            items.extend(flatten(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

>>> flatten({'a': 1, 'c': {'a': 2, 'b': {'x': 5, 'y' : 10}}, 'd': [1, 2, 3]})
{'a': 1, 'c_a': 2, 'c_b_x': 5, 'd': [1, 2, 3], 'c_b_y': 10}
票数 279
EN

Stack Overflow用户

发布于 2017-01-23 16:12:06

或者,如果你已经在使用pandas,你可以像这样用json_normalize()来做:

代码语言:javascript
复制
import pandas as pd

d = {'a': 1,
     'c': {'a': 2, 'b': {'x': 5, 'y' : 10}},
     'd': [1, 2, 3]}

df = pd.json_normalize(d, sep='_')

print(df.to_dict(orient='records')[0])

输出:

代码语言:javascript
复制
{'a': 1, 'c_a': 2, 'c_b_x': 5, 'c_b_y': 10, 'd': [1, 2, 3]}
票数 136
EN

Stack Overflow用户

发布于 2013-10-29 08:32:25

这是一种“函数式”、“一行”的实现。它是递归的,并且基于条件表达式和字典理解。

代码语言:javascript
复制
def flatten_dict(dd, separator='_', prefix=''):
    return { prefix + separator + k if prefix else k : v
             for kk, vv in dd.items()
             for k, v in flatten_dict(vv, separator, kk).items()
             } if isinstance(dd, dict) else { prefix : dd }

测试:

代码语言:javascript
复制
In [2]: flatten_dict({'abc':123, 'hgf':{'gh':432, 'yu':433}, 'gfd':902, 'xzxzxz':{"432":{'0b0b0b':231}, "43234":1321}}, '.')
Out[2]: 
{'abc': 123,
 'gfd': 902,
 'hgf.gh': 432,
 'hgf.yu': 433,
 'xzxzxz.432.0b0b0b': 231,
 'xzxzxz.43234': 1321}
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6027558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档