2016-12-29 5 views
1

python 3.5を使用して、私は値を探している設定ファイル(これは制御できません)を読んでいて、私にはOrderedDictを返します。 私が試した:python 3.5複雑なOrderedDictから値を得る

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

をバックタプルのリストを与えたこと、私が探している値がLである[2] - 私はリットルでトンのために行ってきました[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 –

答えて

1

'ssl_cert_arn'というキーが表示されるまで、OrderedDictを再帰的にスキャンする必要があります。

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文の前にprint(d)を実行しました。 関数の外でprint(config)を実行すると、OrderedDictが正常に取得されます。 私は何が欠けているのですか? –

+0

@NaimSalamehこれが問題なのかどうかはわかりませんが、私はタイプミスをしました。それは 'if isinstance(v、OrderedDict):' –

+0

@ NaimSalamehを読んでください。ジェネレータバージョンを使用しているなら、 'list(recursive_scan()のようなものでリストに結果をプルする必要があります。 config、 'ssl_cert_arn')) ' –

関連する問題