【问题标题】:How can I make a tree diagram in Python?如何在 Python 中制作树形图?
【发布时间】:2021-02-09 02:38:28
【问题描述】:

这是我为分类动物列表而制作的不完整树形图:

马、牛、羊、猪、狗、猫、狮子、老虎、鲸鱼、海豚、海豹、企鹅、鸵鸟、麻雀、蜘蛛、蚂蚁、蜜蜂、黄蜂、白蚁、章鱼、鱿鱼

我还没有把狗、老虎、狮子等放进去.我的问题是;在 python 代码中,我怎样才能制作一个程序来不断地询问用户是/否问题,直到它可以从列表中找出它是什么动物。显然,我可以使用大量 IF 语句或使用 OOP 并使用属性来做到这一点,但是这两种解决方案都要求我问每一个问题,这相当于很多行代码,而且会很丑陋。例如,我如何做到这一点,这样如果用户说他们的动物是水生的,它就不再问任何不适用于该动物的问题。例如:

如果我选择黄蜂,我对“你的动物是陆地动物吗?”的问题回答“是”,然后对“你的动物是哺乳动物吗?”的问题回答“是”,然后对它是食肉动物并且能够飞行的问题回答“是”,我怎么做才能使程序只分支到这些问题? 基本上,我如何编写一个遵循用户输入的树形图? (我不需要任何图形用户界面)

【问题讨论】:

标签: python oop tree classification diagram


【解决方案1】:

您可以使用经典的 Node 类定义树:

class Node:
    def __init__(self, name, *children):
        self.name = name
        self.children = children

tree = Node("an animal",
    Node("aquatic",
        Node("a cephalapod",
            Node("having 8 tentacles", Node("an octopus")),
            Node("having 10 tentacles", Node("a squid"))
        ), Node("a whale",
            Node("a baleen", Node("a baleen")),
            Node("not a baleen", Node("a dolphin"))
        )
    ), Node("a land animal",
        Node("a mammal",
            Node("a bird",
                Node("able to fly", Node("a sparrow")),
                Node("not able to fly",
                    Node("a piscivore", Node("a penguin")),
                    Node("not a piscivore", Node("an ostrich"))
                )
            ), Node("not a bird",
                Node("a carnivore", Node("a lion")),
                Node("a herbivore", 
                    Node("having leather", Node("a bovine")),
                    Node("not having leather", 
                        Node("having wool", Node("a sheep")),
                        Node("not having wool", Node("a pig"))
                    )
                )
            )
        ), Node("an insect",
            Node("a carnivore",
                Node("able to fly", Node("a wasp")),
                Node("not able to fly",
                    Node("having 6 legs", Node("an ant")),
                    Node("having 8 legs", Node("a spider"))
                )
            ), Node("a herbivore", 
                Node("able to fly", Node("a bee")),
                Node("not able to fly", Node("a termite"))
            )
        )
    )
)

那么主代码就可以继续问题循环了:

node = tree
while node.children:
    answer = "n"
    for child in node.children[:-1]:
        print("Is it {}? (y/n)".format(child.name))
        answer = input()
        if answer.lower() == "y":
            break
    if answer.lower() != "y":
        child = node.children[-1]
    node = child
    print("It is {}".format(node.name))

尽管您的树是二叉树,但此代码预见到有超过 2 个孩子的可能性。当对选择第一个孩子的问题回答“否”时,它会问会导致第二个孩子的问题,......等等,直到只剩下一个孩子作为可能性:它不会问相应的问题,因为这是唯一的选择。

【讨论】:

  • 这非常有帮助。我刚刚运行了代码,现在要绕开它,但是有一个易于管理的解决方案真是太棒了。谢谢你的一切。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2015-06-06
  • 1970-01-01
  • 2011-12-01
  • 2012-10-07
  • 2011-01-04
相关资源
最近更新 更多