【发布时间】:2020-05-06 23:57:29
【问题描述】:
我有一个从 YAML 读取的嵌套结构,它由嵌套列表和/或嵌套 dicts 或在不同嵌套级别的两者混合组成。可以假设该结构不包含任何递归对象。
如何仅从中提取叶值?另外,我不想要任何 None 值。叶值包含我所关心的字符串。考虑到结构的最大深度不足以超过堆栈递归限制,可以使用递归。生成器也可以选择。
存在处理扁平化列表或字典的类似问题,但不是两者的混合。或者,如果扁平化一个字典,它们也会返回我并不真正需要的扁平化键,并且存在名称冲突的风险。
我尝试了more_itertools.collapse,但它的示例仅表明它适用于嵌套列表,而不适用于字典和列表的混合。
示例输入
struct1 = {
"k0": None,
"k1": "v1",
"k2": ["v0", None, "v1"],
"k3": ["v0", ["v1", "v2", None, ["v3"], ["v4", "v5"], []]],
"k4": {"k0": None},
"k5": {"k1": {"k2": {"k3": "v3", "k4": "v6"}, "k4": {}}},
"k6": [{}, {"k1": "v7"}, {"k2": "v8", "k3": "v9", "k4": {"k5": {"k6": "v10"}, "k7": {}}}],
"k7": {
"k0": [],
"k1": ["v11"],
"k2": ["v12", "v13"],
"k3": ["v14", ["v15"]],
"k4": [["v16"], ["v17"]],
"k5": ["v18", ["v19", "v20", ["v21", "v22", []]]],
},
}
struct2 = ["aa", "bb", "cc", ["dd", "ee", ["ff", "gg"], None, []]]
预期输出
struct1_leaves = {f"v{i}" for i in range(23)}
struct2_leaves = {f"{s}{s}" for s in "abcdefg"}
【问题讨论】:
标签: python recursion nested flatten