2016-12-29 66 views
1

我正在讀一個配置文件(我無法控制)尋找一個值,它給了我一個OrderedDict。 我想:python 3.5使用python 3.5獲取值的複雜OrderedDict

l = list(dict.items()) 
for t in l: 
    print(t) 

,給了回來元組的列表,我正在尋找的值是L [2] - 所以我去了在L T [2],這給了後面的另一個複雜的輸出:

('driver', OrderedDict([('type', 'aws'), ('aws', 
OrderedDict([('upload_credentials', True), ('availability_zones', 
OrderedDict([('eu-west-1', [OrderedDict([('zone', 'eu-west-1a'), ('subnet', 
'10.0.0.0/22')])...('ssl_cert_arn', 'arn:aws:acm:us-west-2:12345667777')]))... 

這裏是我卡住了,我已經使用循環,遞歸,dict.values等不同的嘗試..但我不能達到我想要的價值。 我如何從這裏開始,假設我在正確的軌道上。 我正在尋找那個ssl值。

+0

'dpath'可能派上用場:https://github.com/akesterson/dpath-python – 2016-12-29 19:12:15

回答

1

我們只需遞歸掃描OrderedDict,直到看到'ssl_cert_arn'密鑰。

def recursive_scan(d, target): 
    if target in d: 
     return d[target] 
    for v in d.values(): 
     if isinstance(v, OrderedDict): 
      ret = recursive_scan(v, target) 
      if ret is not None: #Maybe v[target] is some falsey value like "" 
       return ret 
    return None 

經過進一步的反思,這可能會更好地發揮作爲發電機。

def recursive_scan(d, target): 
    if target in d: 
     yield d[target] 
    for v in d.values(): 
     if isinstance(v, OrderedDict): 
      yield from recursive_scan(v, target) 
+0

哇,這很快,謝謝。我按照你的建議做了,但是我沒有收回任何東西,我甚至在函數的開頭添加了一個打印,但什麼也沒有。 recursive_scan(config,'ssl_cert_arn') 我在第一條if語句之前打印了(d),我很感謝您對這一條的耐心。 如果我打印(配置)功能以外我得到OrderedDict預期。 我錯過了什麼朋友? –

+0

@NaimSalameh不知道這是否是問題,但我犯了一個錯字。它應該讀取'if isinstance(v,OrderedDict):' –

+0

@NaimSalameh如果你使用的是生成器版本,你將不得不把結果拖到一個列表中,比如'list(recursive_scan( config,'ssl_cert_arn'))' –