2017-12-25 9 views
-1

私は時々変更することができ、このパスがあります。パスのパス(文字列)によって、辞書のキーを取得する

'#/path/to/key' 

部品が定義されていないが、ので、この値も結構です

'#/this/is/a/longer/path' 

私は

['#', 'path', 'to', 'key'] 

を取得し、私はこのパスのキーを取得する必要があるので、のは私の辞書にはEXPであるとしましょう「/」で、このキーを分割しています、I nはそう

exp['path']['to']['key'] 

このキーにアクセスするにはどのようにすればよいでしょうか?

答えて

3

あり、ここでいくつかの良い答えていますが、それらのどれもが、いくつかの正しくないパスまたはパスを占めていない

def deref_multi(data, keys): 
    return deref_multi(data[keys[0]], keys[1:]) \ 
     if keys else data 

last = deref_multi(exp, ['path','to','key']) 
+0

これは完璧な仕事でした! ありがとう –

1
>>> exp = {'path': {'to': {'key': 42}}} 
>>> my_key = exp 
>>> for i in '#/path/to/key'.split('/')[1:]: 
>>>  my_key = my_key[i] 
>>> print(my_key) 
42 

しかし、私はあなたがこれで何を意味するかと仮定すると、

1

、このような辞書を取得した方法について少し興味があり、あなたの配列['#', 'path', 'to', 'key']はインデックス1から始まるネストされたにリードインデックスを持っている、あなたは反復処理できることですリスト内の各項目は2番目の項目から始まり、各繰り返しまで深く掘り下げます。

たとえば、Python 3ではこれを行うことができます。

def get_key_from_path(exp, path): 
    """Returns the value at the key from <path> in <exp>. 
    """ 
    cur = exp 
    for dir in path[1:]: 
     cur = exp[dir] 
    return cur 
1
def get_key_by_path(dict_obj, path_string): 
    path_list = path_string.split('/')[1:] 
    obj_ptr = dict_obj 
    for elem in path_list: 
     obj_ptr = obj_ptr[elem] 
    return obj_ptr 
1

...再帰、ルークを使用します添え字のないものになります。以下のコードは、このようなケースを扱う際に少し余裕を持てるようにしていますが、これまでの他のコードはエラーを投げたり予期しない動作をしたりします。

path = '#/path/to/key' 
exp = {'path' : { 'to' : { 'key' : "Hello World"}}} 

def getFromPath(dictionary, path): 
    curr = dictionary 
    path = path.split("/")[1:] # Gets rid of '#' as it's uneccessary 
    while(len(path)): 
     key = path.pop(0) 
     curr = curr.get(key) 
     if (type(curr) is not dict and len(path)): 
      print("Path does not exist!") 
      return None 
    return curr 

print(getFromPath(exp, path)) #Your value 
関連する問題