8

我有一个字典对象:

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

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

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

它看起来像这样

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

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

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

4

2 回答 2

17

使用递归函数

您可能需要考虑使用递归函数(就像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')

生成的树结构

在此处输入图像描述

于 2012-12-03T19:32:44.397 回答
1

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

dictionary[key]

这将返回给您该键的值。如果该键不在字典中,它将返回 a 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'
于 2012-12-03T17:28:14.790 回答