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

标签 python python-3.x recursion

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

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/

相关文章:

JavaScript 在 JSON 对象中递归搜索

python - Python 中的 prophet 包和 fbprophet 有什么区别?

python - 如何用插值替换 pandas df 中的值

python - 应该如何使用 python pep484 类型检查返回 self 的上层方法

python - 如何知道可以为 Python 3 中的平台设置的最大递归深度?

django - Django 'runserver'命令产生错误

java - 给定一个数字,使用递归找到它下面的哪些数字将它相除

java - 作业问题: Need just a hint for the base case to throw an exception for a recursive binary search when a word doesn't exist

python - 在 Pandas 条形图中设置 xticks

python - 如何确定 Python 中嵌套数据结构的类型?