【问题标题】:Dictionary object to decision tree in PydotPydot中决策树的字典对象
【发布时间】:2012-11-21 05:21:39
【问题描述】:

我有一个这样的字典对象:

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

我正在尝试使用带有“菜单”数据this 的 pydot 创建一个图表(决策树)。

'Dinner' 将是顶部节点,其值(鸡肉、牛肉等)位于其下方。参考链接,graph函数有两个参数;一个源和一个节点。

它看起来像 this:

除了“king”是“dinner”,“lord”是“chicken”、“beef”等。

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

关于如何绘制它的任何建议?

【问题讨论】:

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


    【解决方案1】:

    使用递归函数

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

    生成的树结构

    【讨论】:

    • 是的,这正是我正在做的事情。我唯一要更改的是在相应节点下为“坏”、“平均”、...添加另一个气泡。不过这很棒。
    • 另外,我在哪里粘贴 graph.write_png('...')?
    • 为了完整起见,我只是将其添加到我的代码中。感谢您接受答案。
    • graph.write_png('example1_graph.png'),这个 write_png 函数给了我以下错误。谁能帮我摆脱错误?错误:带有 args ['-Tpng', 'C:\\Users\\MYPC~1\\AppData\\Local\\Temp\\tmptnelq9i2'] 的“点”返回代码:1 标准输出,标准错误:b'' b '格式:“png”无法识别。未找到任何格式。\r\n也许需要运行“dot -c”(使用安装程序的权限)来注册插件?\r\n'
    • 是的,我也遇到同样的错误,FileNotFoundError: [Errno 2] "dot" not found in path.
    【解决方案2】:

    您的问题对我来说并不完全清楚,但在 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'
    

    【讨论】:

    • 让我改写一下:请注意,'dinner' 的值中有键。如何访问这些键的值?不确定这是否清楚。例如,如何获取键“豆腐”的值?
    猜你喜欢
    • 2015-09-21
    • 2014-08-30
    • 2015-04-07
    • 2013-11-05
    • 2018-01-12
    • 2019-08-17
    • 2016-08-21
    • 2017-09-29
    • 2015-06-28
    相关资源
    最近更新 更多