如何解决提取在嵌套字典和列表中找到的叶子值集不包括“无”
这是参考答案的改编,以使用内部函数和单个函数set
。它还使用递归为问题中包含的样本输入生成预期输出。它避免了使每个叶子都经过整个调用堆栈。
from typing import Any, Set
def leaves(struct: Any) -> Set[Any]:
"""Return a set of leaf values found in nested dicts and lists excluding None values."""
# Ref: https://stackoverflow.com/a/59832594/
values = set()
def add_leaves(struct_: Any) -> None:
if isinstance(struct_, dict):
for sub_struct in struct_.values():
add_leaves(sub_struct)
elif isinstance(struct_, list):
for sub_struct in struct_:
add_leaves(sub_struct)
elif struct_ is not None:
values.add(struct_)
add_leaves(struct)
return values
解决方法
我从YAML中读取了一个嵌套结构,该结构由嵌套列表和/或嵌套dict或两者在各种嵌套级别的混合组成。可以假定该结构不包含任何递归对象。
如何仅从其中提取叶值?另外,我不要任何None
价值。叶子值包含我所关心的所有字符串。考虑到结构的最大深度不足以超过堆栈递归限制,可以使用递归。生成器也可以是不错的选择。
存在类似的问题,这些问题涉及扁平化列表或字典,但不能同时使用两者。另外,如果拼合一个字典,它们也会返回我并不需要的拼合键,并且可能会导致名称冲突。
我尝试过,more_itertools.collapse
但是它的示例仅显示它可用于嵌套列表,而不能与字典和列表混合使用。
样本输入
struct1 = {
"k0": None,"k1": "v1","k2": ["v0",None,"v1"],"k3": ["v0",["v1","v2",["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"],[]]]
预期产出
struct1_leaves = {f"v{i}" for i in range(23)}
struct2_leaves = {f"{s}{s}" for s in "abcdefg"}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。