gpt4 book ai didi

python - 字典叶生成器

转载 作者:行者123 更新时间:2023-12-05 04:40:07 26 4
gpt4 key购买 nike

这是我的树,一个嵌套的字典

tree = {"root": {"branch_a": {"branch_aa": 0, "branch_ab": 1},
"branch_b": 1,
"branch_c": {"branch_ca": {"branch_caa": 0}}}}

我设法写了一个打印所有叶子的函数

def print_leaves(tree):
if not hasattr(tree, "__iter__"):
print(tree)
elif isinstance(tree, dict):
for branch in tree.values():
print_leaves(branch)

产生所需的输出

0
1
1
0

在这一点上,我认为将操作(在本例中为打印)与对叶子的访问分离会很好。所以我稍微修改了上面的函数,把它变成了一个生成器,并将打印部分移动到一个for循环中。

def generate_leaves(tree):
if not hasattr(tree, "__iter__"):
yield tree
elif isinstance(tree, dict):
for branch in tree.values():
generate_leaves(branch)

for leaf in generate_leaves(tree):
print(leaf)

...不幸的是,这不起作用。

首先,为什么它不起作用?然后,当然,如何正确编写叶生成器?

最佳答案

您没有使用递归调用的结果。这适用于没有返回值的 print_leaves,但不适用于具有 returnyield 的函数。

这是长版:

def generate_leaves(tree):
if not hasattr(tree, "__iter__"):
yield tree
elif isinstance(tree, dict):
for branch in tree.values():
for leaf in generate_leaves(branch):
yield leaf

for leaf in generate_leaves(tree):
print(leaf)

幸运的是,我们可以使用 yield from 使它更短:

def generate_leaves(tree):
if not hasattr(tree, "__iter__"):
yield tree
elif isinstance(tree, dict):
for branch in tree.values():
yield from generate_leaves(branch)

for leaf in generate_leaves(tree):
print(leaf)

请注意,您只需要一个带有一个条件的if/else;不需要带有两个冗余条件的 if/elif:

def generate_leaves(tree):
if not isinstance(tree, dict):
yield tree
else:
for branch in tree.values():
yield from generate_leaves(branch)

for leaf in generate_leaves(tree):
print(leaf)

关于 yield from 的资源:

关于python - 字典叶生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70337670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com