2016-03-29 4 views
0
c_dict = {'a': {'b': {'c': [1], 'd': [{'e': {'val': [1]}}, {'e': {'val': []}}]}}} 
def clean_dict(d): 
    for key, val in d.items(): 
     if isinstance(val, list): # CAT -> This "if" handles list of dicts 
      for i in val: 
       if isinstance(i, dict): 
        val = clean_dict(i) 
     if isinstance(val, dict): 
      val = clean_dict(val) 
     if val is None or val == {} or val == []: 
      del d[key] 
    return d 
print clean_dict(c_dict) 

出力は次のようになります。
解析ネストされた辞書のpythonとそのすべてのリーフノードが空の場合、完全な階層を削除

{'a': {'b': {'c': [1]}}} 

しかし、予想される出力は次のようになります。リスト内のよう

{'a': {'b': {'c': [1], 'd':[{'e':{'val':[1]}}]}}} 

リーフノードが空でないディクテーションが存在します。
ここに不足していることを教えてください。

+0

のためにどうあるべきかを出力 '{ 'A':{ 'B':1、 'C':[]}} ' –

+0

@Germn、{'a':{'b':1}} – Suren

答えて

1

関数clean_dict関数は、受信したdictの場所を変更する代わりに、新しい辞書を作成する必要があります。 val == {} or val == []len(val) == 0

c_dict = {'a': {'b': {'c': [1], 'd': [{'e': {'val': [1]}}, {'e': {'val': []}}]}}} 
def clean_dict(d): 
    ret = {k: v for k, v in d.items()} 
    for key, val in d.items(): 
    if isinstance(val, list): # CAT -> This "if" handles list of dicts 
     for i in val: 
      if isinstance(i, dict): 
       val = clean_dict(i) 
     ret[key] = val 
    elif isinstance(val, dict): 
     val = clean_dict(val) 
     ret[key] = val 
    elif val is None or len(val) == 0: 
     pass 
    return ret 
print clean_dict(c_dict) 

出力で置き換えることができます:

{'a': {'b': {'c': [1], 'd': {'e': {'val': []}}}}} 

しかし、それは期待の答えではありません。問題は、リストが適切に処理されないことです。

c_dict = {'a': {'b': {'c': [1], 'd': [{'e': {'val': [1]}}, {'e': {'val': []}}]}}} 


def clean_dict(d): 
    ret = {} 
    for key, val in d.items(): 
    if isinstance(val, list): # CAT -> This "if" handles list of dicts 
     val = clean_list(val) 
     if len(val) > 0: 
      ret[key] = val 
    elif isinstance(val, dict): 
     val = clean_dict(val) 
     if len(val) > 0: 
      ret[key] = val 
    return ret 


def clean_list(l): 
    ret = [] 
    for elem in l: 
    try: 
     iter(elem) # raise TypeError if not iterable 
     if isinstance(elem, dict): 
      elem = clean_dict(elem) 
      if len(elem) > 0: 
       ret.append(elem) 
     elif isinstance(elem, list): 
      elem = clean_list(elem) 
      if len(elem) > 0: 
       ret.append(elem) 
     else: 
      ret.append(elem) 
    except TypeError: # elem is not an iterable 
     ret.append(elem) 
    return ret 


print clean_dict(c_dict) 

ouputs::さんは、専用の機能でそれをカプセル化してみましょう

{'a': {'b': {'c': [1], 'd': [{'e': {'val': [1]}}]}}} 
関連する問題