字典对象到Pydot的决策树

时间:2012-12-03 17:18:31

标签: python dictionary machine-learning decision-tree pydot

我有一个字典对象:

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

我尝试使用pydot创建一个图表(决策树),并使用'菜单'数据this

'晚餐'将是顶级节点,其价值(鸡肉,牛肉等)低于它。参考链接,图形函数有两个参数;来源和节点。

看起来像this

除了国王和#39;将是晚餐'并且'领主'将是' chicken','牛肉'等

我的问题是:如何访问值中的键?要从这些数据创建一个树,我觉得我需要创建一个循环,检查是否有特定键的值并绘制它。我不确定如何为任何字典对象调用值(如果它不一定被称为'晚餐'或者具有尽可能多的元素。)

有关如何绘制图表的任何建议吗?

2 个答案:

答案 0 :(得分:10)

使用递归函数

您可能需要考虑使用递归函数(如下面代码中的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

答案 1 :(得分:1)

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

dictionary[key]

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

If-statement(首选):

if key in dictionary:
    return dictionary[key]

的try-catch:

try:
    return dictionary[key]
except KeyError:
    pass

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

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

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