関数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]}}]}}}
のためにどうあるべきかを出力 '{ 'A':{ 'B':1、 'C':[]}} ' –
@Germn、{'a':{'b':1}} – Suren