gpt4 book ai didi

python - 不要在递归树打印机中缩进第一层树

转载 作者:行者123 更新时间:2023-12-05 05:30:59 25 4
gpt4 key购买 nike

我想重构我编写的递归树打印函数,以便根节点(第一个调用)完全不缩进。

Tree = dict[str, 'Tree']
def print_tree(tree: Tree, prefix: str=''):
if not tree:
return
markers = [('├── ', '│   '), ('└── ', ' ')]
children = list(tree.items())
for key, subtree in children:
is_last_child = (key, subtree) == children[-1]
key_prefix, subtree_prefix = markers[is_last_child]
print(prefix + key_prefix + key)
print_tree(subtree, prefix + subtree_prefix)

tree = {'.': {'alpha':{}, 'beta': {'beta.alpha':{}, 'beta.beta':{}}, 'charlie': {'charlie.alpha':{}, 'charlie.beta':{}, 'charlie.charlie':{}}, 'delta':{}}}
print_tree(tree)

当前输出为

└── .
├── alpha
├── beta
│   ├── beta.alpha
│   └── beta.beta
├── charlie
│   ├── charlie.alpha
│   ├── charlie.beta
│   └── charlie.charlie
└── delta

但我希望输出是

.
├── alpha
├── beta
│   ├── beta.alpha
│   └── beta.beta
├── charlie
│   ├── charlie.alpha
│   ├── charlie.beta
│   └── charlie.charlie
└── delta

我想不出一种优雅的方式来完成它,就像在没有特殊外壳的情况下这样的第一个调用:

def print_tree(tree: Tree, prefix: str='', root: bool=True):
if not tree:
return
markers = [('├── ', '│   '), ('└── ', ' ')]
if root:
markers = [('', ''), ('', '')]
children = list(tree.items())
for key, subtree in children:
is_last_child = (key, subtree) == children[-1]
key_prefix, subtree_prefix = markers[is_last_child]
print(prefix + key_prefix + key)
print_tree(subtree, prefix + subtree_prefix, root=False)

我怎样才能改变我递归的方式来完成这个?我不想向函数添加额外的参数或以其他方式需要有关状态的更多信息。我喜欢我当前的功能是多么简单,它只是在我真的不想要它时为第一级添加前缀。

最佳答案

漂亮的算法,我喜欢! (比 mine 好多了)

这是我在您给定的约束条件下所能做的最好的事情:

Tree = dict[str, 'Tree']
def print_tree(tree: Tree, prefix: str=None):
markers = [('├── ', '│ '), ('└── ', ' '), ('', '')]
for i, (key, subtree) in enumerate(tree.items()):
is_last_child = i == len(tree) - 1
marker_index = 2 if prefix is None else is_last_child
prefix = prefix or ""
key_prefix, subtree_prefix = markers[marker_index]
print(prefix + key_prefix + key)
print_tree(subtree, prefix + subtree_prefix)

tree = {'.': {'alpha':{}, 'beta': {'beta.alpha':{}, 'beta.beta':{}}, 'charlie': {'charlie.alpha':{}, 'charlie.beta':{}, 'charlie.charlie':{}}, 'delta':{}}}
print_tree(tree)
.
├── alpha
├── beta
│ ├── beta.alpha
│ └── beta.beta
├── charlie
│ ├── charlie.alpha
│ ├── charlie.beta
│ └── charlie.charlie
└── delta
  • 通过设置默认值 Noneroot 指示符存储在 prefix
  • 添加了仅 root 使用的第三个标记选项
  • enumerate 替换 children 列表,使用 i 检查它是否是最后一个 child
  • 删除了不必要的空树检查

关于python - 不要在递归树打印机中缩进第一层树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74484283/

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