首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得嵌套字典键作为点分隔字符串的列表?

如何获得嵌套字典键作为点分隔字符串的列表?
EN

Stack Overflow用户
提问于 2015-04-17 02:15:08
回答 3查看 1.6K关注 0票数 3

假设我有一本字典,看起来像:

代码语言:javascript
复制
d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}

我想要一个所有键的列表,这些键的值不是其他的dict,而是用它们的点表示法表示的(假设您在dict的每个级别上都有‘点’)。换句话说,我想要所有没有孩子的值的复合点符号键。

例如,对于上面的dict,我想得到(不一定按任何顺序):

代码语言:javascript
复制
['a',
 'b.sa',
 'b.sb',
 'b.sc.ssa',
 'b.sc.ssb',
 'c']
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-17 02:36:13

我相信有一个更优雅的方法来解决这个问题,但这应该会让你开始。

代码语言:javascript
复制
d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}

def dotter(d, key, dots):

    if isinstance(d, dict):
        for k in d:
            dotter(d[k], key + '.' + k if key else k, dots)
    else:
        dots.append(key)

    return dots

print dotter(d, '', [])
票数 3
EN

Stack Overflow用户

发布于 2015-04-17 02:36:00

代码语言:javascript
复制
d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3} 
def fun(k, d, pre):
    path = '%s.%s' % (pre, k) if pre else k
    return path if type(d[k]) is not dict else ",".join([fun(i,d[k], path) for i in d[k]])

print ",".join([fun(k,d, '') for k in d]).split(',')

输出

‘’,'c','b.sc.ssa','b.sc.ssb','b.sb','b.sa‘

票数 1
EN

Stack Overflow用户

发布于 2017-12-12 07:51:56

如果您想让dict有它的值

代码语言:javascript
复制
def dotter(mixed, key='', dots={}):
    if isinstance(mixed, dict):
        for (k, v) in mixed.items():
            dotter(mixed[k], '%s.%s' % (key, k) if key else k)
    else:
        dots[key] = mixed

    return dots

>>> d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}
>>> dotted_dict = dotter(d)
>>> print(dotted_dict)
{'a': 1, 'c': 3, 'b.sa': 11, 'b.sb': 22, 'b.sc.ssb': 222, 'b.sc.ssa': 111}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29689081

复制
相关文章

相似问题

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