2017-07-12 11 views
-1

で私は、output_dict = [x for x in chunks if x[given_key] == given_value]はこれを試し辞書PythonのフィルタJSONは値

[ 
    {'ab':1, 
    'aa'":'false', 
    'el':[ 
     {'uu':2, 
     ... 
     } 
    ] 
    'req':{ 
     'a':{ 
      'percent':100 
     } 
    } 
    }, 
] 

のリストを持っています。これはプレーンキーに対してのみ機能します。サブリスト内の値、ネストされたディクショナリでは機能しません。私はちょうどユーザーからキーと値を読み取り、その値に一致するリストのすべての辞書を印刷したい。

ここで、given_key = percentとgiven_value = 100と言ってください。この辞書全体(および他の一致する辞書)を印刷したいと思います。

{'ab':1, 
    'aa'":'false', 
    'el':[ 
     {'uu':2, 
     ... 
     } 
    ] 
    'req':{ 
     'a':{ 
      'percent':100 
     } 
    } 
    } 

リストは、とにかくJSON形式です。どうすればこれを実現できますか?どんな助けもありがとう。

+1

の可能性のある重複[PythonでJSON配列をフィルタリングする方法](https://stackoverflow.com/questions/27189892/how-to-filter-json-array-in-python)の –

+2

可能重複キーを再帰的に検索する](https://stackoverflow.com/questions/14962485/finding-a-key-recursively-in-a-dictionary) –

答えて

0

私は再帰ソリューションを考え出しました。

最初に、再帰停止条件は、指定されたキーがdictまたはdub dictキーにあるかどうかです。

第2に、サブ要素がdictの場合は、get_by_keyへの呼び出しを返します。

第3に、サブ要素がリストである場合、リストを反復したい場合、要素がdictの場合はget_by_keyを呼び出します。

di = {'ab':1, 
    'aa':'false', 
    'sample_list': [{"test": "test", "percent": 95}], 
    'el':[ 
     {'uu':2, 
     } 
    ], 
    'req':{ 
     'a':{ 
      'percent':100, 
     } 
    } 
    } 


def get_by_key(given_key, my_di, res, parent=None): 
    if given_key in my_di.keys(): 
    res.append(parent) 
    return res 
    for k, v in my_di.items(): 
    if isinstance(v, dict): 
     if parent is not None: 
     return get_by_key(given_key, v, res, parent) 
     else: 
     return get_by_key(given_key, v, res, v) 
    elif isinstance(v, list): 
     for item in v: 
     if isinstance(item, dict): 
      if parent is not None: 
      get_by_key(given_key, item, res, parent) 
      else: 
      get_by_key(given_key, item, res, v) 



result = get_by_key("percent", di, []) 

print (result) 

>>> [[{'test': 'test', 'percent': 95}], {'a': {'percent': 100}}] 
+0

一致するキーを印刷するだけではなく、一致する辞書全体を印刷したいと値。 – HighlyCurious

+0

@ HighlyCurious、親ロジックをサポートするコードを編集しました。 –