Pyd中决策树的字典对象

2024-06-01 22:11:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典对象:

menu = {'dinner':{'chicken':'good','beef':'average','vegetarian':{'tofu':'good','salad':{'caeser':'bad','italian':'average'}},'pork':'bad'}}

我正在尝试使用pydot和'menu'数据this创建一个图(决策树)。

“Dinner”是最上面的节点,它的值(鸡肉、牛肉等)在下面。对于链接,graph函数接受两个参数:源和节点。

它看起来像this

除了“国王”是“晚餐”,“领主”是“鸡肉”,“牛肉”等

我的问题是:如何访问值中的密钥?为了从这些数据中创建一个树,我觉得我需要创建一个循环来检查是否有一个特定键的值并绘制它。我不知道如何为任何dictionary对象调用值(如果它不一定被称为“dinner”或有那么多元素的话)。

关于如何绘制图表有什么建议吗?


Tags: 数据对象字典节点绘制thismenubad
2条回答

使用递归函数

您可能需要考虑使用一个递归的函数(就像下面我的代码中的visit),这样您就可以处理一个通用的嵌套字典。在这个函数中,您需要传递一个parent参数来跟踪谁是您的传入节点。还要注意,您使用isinstance来检查键的字典值是否是它自己的字典,在这种情况下,您需要递归地调用visit

import pydot

menu = {'dinner':
            {'chicken':'good',
             'beef':'average',
             'vegetarian':{
                   'tofu':'good',
                   'salad':{
                            'caeser':'bad',
                            'italian':'average'}
                   },
             'pork':'bad'}
        }

def draw(parent_name, child_name):
    edge = pydot.Edge(parent_name, child_name)
    graph.add_edge(edge)

def visit(node, parent=None):
    for k,v in node.iteritems():
        if isinstance(v, dict):
            # We start with the root node whose parent is None
            # we don't want to graph the None node
            if parent:
                draw(parent, k)
            visit(v, k)
        else:
            draw(parent, k)
            # drawing the label using a distinct name
            draw(k, k+'_'+v)

graph = pydot.Dot(graph_type='graph')
visit(menu)
graph.write_png('example1_graph.png')

结果树结构

enter image description here

我不太清楚您的问题,但在Python中访问字典键值的方法很简单:

dictionary[key]

这将返回给你钥匙的价值。如果该键不在字典中,它将返回一个KeyError,因此如果您正在使用字典,并且不确定您请求的键是否在字典中,则有两个选项。

If语句(首选):

if key in dictionary:
    return dictionary[key]

尝试捕获:

try:
    return dictionary[key]
except KeyError:
    pass

如果您不知道字典中的键,需要获取它们,只需调用dictionary.keys(),它就会返回字典中所有键的列表。

获取字典键的值将返回一个甚至可能是另一个对象的对象。例如,为了找出"tofu"的值,我们将执行以下操作:

menu['dinner']['vegetarian']['tofu']
# returns value 'good'

相关问题 更多 >