如何将嵌套字典键列表作为点分隔字符串?

时间:2015-04-17 02:15:08

标签: python dictionary

说我有一个类似的字典:

d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}

我想要一个列表,列出其值不是其他词组的所有键,但用点符号表示(假设你在dict的每个级别'点')。换句话说,我想要所有没有孩子的值的复合点符号键。

例如,对于上述词典,我想得到(不一定按任何顺序):

['a',
 'b.sa',
 'b.sb',
 'b.sc.ssa',
 'b.sc.ssb',
 'c']

3 个答案:

答案 0 :(得分:2)

我确信有一种更优雅的方法可以解决这个问题,但这应该可以让你开始。

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, '', [])

答案 1 :(得分:0)

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(',')

输出

  

[' a'' c',' b.sc.ssa',' b.sc.ssb',&# 39; b.sb',' b.sa']

答案 2 :(得分:0)

如果您想要dict及其值

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}