如何加入嵌套Python字典的值?

TIM*_*MEX 4 python

假设我有一本字典,它里面嵌有字典.我想以递归方式加入该词典的所有值?

' '.join(d.values())
Run Code Online (Sandbox Code Playgroud)

如果没有巢,这是有效的.

Pär*_*der 7

以下适用于任何非递归嵌套dicts:

def flatten_dict_values(d):
    values = []
    for value in d.itervalues():
        if isinstance(value, dict):
            values.extend(flatten_dict_values(value))
        else:
            values.append(value)
    return values

>>> " ".join(flatten_dict_values({'one': 'not-nested',
...                                'two': {'three': 'nested',
...                                        'four': {'five': 'double-nested'}}}))
'double-nested nested not-nested'
Run Code Online (Sandbox Code Playgroud)

编辑:支持递归dicts

如果您需要支持自引用dicts,则需要扩展上述代码以跟踪所有已处理的dicts并确保您永远不会尝试处理您已经看过的字典.以下是一个相当便宜,可读的方法:

def flatten_dict_values(d, seen_dict_ids=None):
    values = []
    seen_dict_ids = seen_dict_ids or set()
    seen_dict_ids.add(id(d))
    for value in d.itervalues():
        if id(value) in seen_dict_ids:
            continue
        elif isinstance(value, dict):
            values.extend(flatten_dict_values(value, seen_dict_ids))
        else:
            values.append(value)
    return values

>>> recursive_dict = {'one': 'not-nested',
...                   'two': {'three': 'nested'}}
>>> recursive_dict['recursive'] = recursive_dict
>>> " ".join(flatten_dict_values(recursive_dict))
'nested not-nested'
Run Code Online (Sandbox Code Playgroud)