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

Python 如何获取嵌套字典键列表作为点分隔字符串?,python,dictionary,Python,Dictionary,假设我有一本字典,看起来像: d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3} 我想要一个所有键的列表,这些键的值不是其他dict,而是由它们的点表示法表示的(假设您在dict的每个级别上都有“点”)。换句话说,我希望所有没有子元素的值都使用复合点符号键 例如,对于上面的dict,我想得到(不一定按任何顺序): 输出 ['a','c','b.sc.ssa','b.sc.ssb','b.

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

d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}
我想要一个所有键的列表,这些键的值不是其他dict,而是由它们的点表示法表示的(假设您在dict的每个级别上都有“点”)。换句话说,我希望所有没有子元素的值都使用复合点符号键

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

输出

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


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

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

以防您需要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}

尝试实现某种递归函数。请展示你自己所做的任何尝试。我应该包括我的例子。我没有正确地复发——我想是大脑的失误吧。感谢您的批评&下次注意。;)有趣的是(对我来说),我在函数args中添加了键和点的默认值,这样你就可以用
dotter(d)
调用,但是后续调用会保存上次的结果并附加到它们,所以如果我
dotter(d)
那么
dotter(e)
,第二次调用将返回d和e的结果。我相信这是一个很好的解释,但我不知道。不管怎样,谢谢你的帮助。这是OT,但对于任何谷歌用户来说,上面的“有趣”小道消息在这里都有很好的解释:。
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, '', [])
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}