8

私はそのような辞書オブジェクトを持っています:

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

pydotと'menu'データを使用してグラフ(決定木)を作成しようとしています

「ディナー」が最上位ノードになり、その値(鶏肉、牛肉など)はその下にあります。リンクを参照すると、グラフ関数は2つのパラメーターを取ります。ソースとノード。

これは次のようになります

「王」が「夕食」であり、「領主」が「鶏肉」、「牛肉」などであることを除いて。

私の質問は、値のキーにアクセスするにはどうすればよいですか?このデータからツリーを作成するには、特定のキーの値があるかどうかをチェックしてプロットするループを作成する必要があるように感じます。ディクショナリオブジェクトの値を呼び出す方法がわかりません(必ずしも「ディナー」と呼ばれるとは限らない場合、または同じ数の要素がある場合)。

それをグラフ化する方法について何か提案はありますか?

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]

そのキーの値が返されます。そのキーが辞書にない場合は、が返されKeyErrorます。したがって、辞書を使用していて、要求しているキーが辞書にあるかどうかわからない場合は、2つのオプションがあります。

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 に答える