我如何在可能出现嵌套字典或列表的地方使用字典理解

And*_*rew 2 python dictionary

如何对以下值使用字典理解literalslist

现在我可以迭代嵌套字典并获得带有嵌套值的结果字典,但我想包含在输出dict、列表和文字(int,str)中

这是我的例子(我知道isinstance这里不需要)

nested_dict = {'first':{'a':1}, 'second':{'b':2}, 'third': 3, 'fourth': [1, 2, 3, 4]}

float_dict = {
    outer_k: { float(inner_v)
        for (inner_k, inner_v) in outer_v.items()}
            for (outer_k, outer_v) in nested_dict.items()
                if isinstance(outer_v, dict) 
}

print(float_dict)
Run Code Online (Sandbox Code Playgroud)

预期输出:

{'first': {'a': 1.0}, 'second': {'b': 2.0}, 'third': 3.0, 'fourth': [1.0, 2.0, 3.0, 4.0]}
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 7

使用单一推导式(合理地)不可能,您需要像这样的递归函数:

def floatify(v):
    if isinstance(v, list):
        return list(map(floatify, v))
    if isinstance(v, dict):
        return {k: floatify(_v) for k, _v in v.items()}
    return float(v)
Run Code Online (Sandbox Code Playgroud)
>>> floatify(nested_dict)
{'first': {'a': 1.0}, 'second': {'b': 2.0}, 'third': 3.0, 'fourth': [1.0, 2.0, 3.0, 4.0]}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使该函数更加通用:

def anyify(v, f):
    if isinstance(v, list):
        return [anyify(_v, f) for _v in v]
    if isinstance(v, dict):
        return {k: anyify(_v, f) for k, _v in v.items()}
    return f(v)

anyify(nested_dict, float)
Run Code Online (Sandbox Code Playgroud)