我有一个字典对象:
menu = {'dinner':{'chicken':'good','beef':'average','vegetarian':{'tofu':'good','salad':{'caeser':'bad','italian':'average'}},'pork':'bad'}}
我尝试使用pydot创建一个图表(决策树),并使用'菜单'数据this。
'晚餐'将是顶级节点,其价值(鸡肉,牛肉等)低于它。参考链接,图形函数有两个参数;来源和节点。
看起来像this:
除了国王和#39;将是晚餐'并且'领主'将是' chicken','牛肉'等
我的问题是:如何访问值中的键?要从这些数据创建一个树,我觉得我需要创建一个循环,检查是否有特定键的值并绘制它。我不确定如何为任何字典对象调用值(如果它不一定被称为'晚餐'或者具有尽可能多的元素。)
有关如何绘制图表的任何建议吗?
答案 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')
答案 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'