2016-10-04 8 views
1

は、私のような構造のpythonオブジェクトを持っていますそのリストがツリーを通る有効なパスを記述しているかどうかを判断したい。これは私の要件を満たしていませんがPython動的オブジェクトクエリ

tree[arr_1[0]][arr_1[1]] # Returns correct object 
tree[arr_2[0]][arr_2[1]] # Returns error 
tree[arr_3[0]][arr_3[1]][arr_3[2]] # Returns correct object 

現在、私はそうのようなケースの答えによって、ケースを達成することができます。私は多くの場合、任意のリスト内のキーのツリーを検索する1つの関数を好むでしょう。

次の機能はほとんど私が望むものですが、さまざまな長さのリストを処理しません。

def is_valid(tree, arr): 
    obj = tree[arr[0]][arr[1]] 
    if len(obj) > 0: 
     return(obj) 
    else: 
     return("No obj") 

現在、この機能出力は

is_valid(tree, arr_1) # Returns the correct result 
is_valid(tree, arr_2) # Returns an error 
is_valid(tree, arr_3) # Returns the same result as arr_1, which is incorrect 

誰も私がarr引数の長さにdynamicically反応するように、この機能を拡大を支援することはできますか?

ありがとうございます!

+0

まずあなたの "dictsのセットは、本当に「STRのリスト」です。次にis_validのキーをループするために 'for key in arr:'を実行してみましょう。第三に、これがhwかユースケースかどうかは分かりませんが、可能であれば、実際のツリーを作成して検索することができます。 – postelrich

答えて

3

これを行う最も簡単な方法は、再帰を利用することだと思います。すべてのサブツリーはツリーであり、すべてのサブパスはパスであるため、パスの最初の要素が有効であるかどうかを調べ、そこから継続することができます。

def is_valid(tree, path): 

    # base case. Any path would be valid for any tree 
    if len(path) == 0: 
     return True 

    # the path must be invalid, no matter what comes before or after 
    if not path[0] in tree: 
     return False 

    # look at the rest 
    return is_valid(tree[path[0]], path[1:]) 

あなたはサブツリーをしたい場合は、パスがあなたの代わりにこれを行うことができますについて説明します。

def is_valid(tree, path): 

    if len(path) == 0: 
     return tree # the only difference 
    if not path[0] in tree: 
     return False 
    return is_valid(tree[path[0]], path[1:]) 
+0

ありがとう!パーフェクトです! – efbbrown

+0

あなたの質問に答えた場合は、回答を受け入れていただければ幸いです。お役に立てて嬉しいです。 – jcolemang

+0

申し訳ありませんが、今行っています。 – efbbrown

関連する問題