2017-09-15 19 views
0

潜在的に深くネストされた辞書の中にあるNoneの値を特定する必要があります。以下は現在存在する私のコードです。これは機能しますが、Noneの値に直接関連付けられたキーの名前のみを返します。ネストされた辞書のNone値の場所を見つけよう

は、私はあなたには、再帰呼び出しと一緒にパスを渡す必要があり

def search_for_None(nested): 
    for key, value in nested.items(): 
     if isinstance(value, dict): 
      search_for_None(value) 
     elif isinstance(value, list): 
      for item in value: 
       if isinstance(item, dict): 
        search_for_None(item) 
     else: 
      if value is None: 
       logging.error("Missing value for key '{0}'".format(key)) 
+0

入力データの例を質問に追加すると、より明確にすることができます。 – Vanojx1

+1

あなたの再帰的アプローチは良いですが、現在の "パス"をパラメータとして渡すか、 'None'の位置を戻り値でビットごとに再アセンブルする必要があります(' return [key] + returned_error_path_list') – Felk

答えて

0

None
(例えばnested["top_key"]["next_key"]["final_key"])を指しているキーのリスト全体を持っていると思います。 pathパラメータは、(「ネストされた」など)の文字列でなければなりません

def search_for_None(nested, path): 
    for key, value in nested.items(): 
     dict_path = f"{path}[{key!r}]" 
     if isinstance(value, dict): 
      search_for_None(value, dict_path) 
     elif isinstance(value, list): 
      for index, item in enumerate(value): 
       list_path = f"{dict_path}[{index!r}]" 
       if isinstance(item, dict): 
        search_for_None(item, list_path) 
     else: 
      if value is None: 
       logging.error("Missing value for key '{0}'".format(dict_path)) 

の下のようなもの

また、あなたが投稿したコード(と私)は、リスト内なし値を見つけることができませんのでご注意(たとえば、 {"a":[None]})その条件のチェックがないためです。

関連する問題