Dictionary object to decision tree in Pydot

前端 未结 2 1843
礼貌的吻别
礼貌的吻别 2021-01-02 17:44

I have a dictionary object as such:

menu = {\'dinner\':{\'chicken\':\'good\',\'beef\':\'average\',\'vegetarian\':{\'tofu\':\'good\',\'salad\':{\'caeser\':\'b         


        
相关标签:
2条回答
  • 2021-01-02 18:20

    Your question isn't entirely clear to me, but the way of accessing a dictionary key's value in Python is simply:

    dictionary[key]
    

    That will return to you that key's value. If that key is not in the dictionary, it will return a KeyError, so if you are working with dictionaries and you're not sure if the key you're requesting will be in the dictionary, you have two options.

    If-statement (preferred):

    if key in dictionary:
        return dictionary[key]
    

    Try-catch:

    try:
        return dictionary[key]
    except KeyError:
        pass
    

    If you don't know the keys in your dictionary and you need to get them, you can simply call dictionary.keys() and it will return a list of all of the keys in the dictionary.

    Getting a the value of a dictionary key will return an object that could even be another object. Thus, to find out the value of "tofu", for example, we'd do the following:

    menu['dinner']['vegetarian']['tofu']
    # returns value 'good'
    
    0 讨论(0)
  • 2021-01-02 18:44

    Using a recursive function

    You might want to consider using a recursive function (like the visit in my code below, so that you are able to process a general nested dictionary. In this function, you want to pass a parent parameter to keep track of who is your incoming node. Also note you use isinstance to check if the dictionary value of a key is a dictionary of its own, in that case you need to call your visit recursively.

    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')
    

    Resulting tree structure

    enter image description here

    0 讨论(0)
提交回复
热议问题