2017-12-12 33 views
0

愚かな質問を申し訳ありませんが、何が間違っていますか?ネストされたdictから項目を再帰的に削除

私はdictを入れました。私はjsonにダンプすることを望んでいました。

[{'text': 'Root', 'children': [{'text': 'X', 'children': [None, None], 'id': 2}, {'text': 'Y', 'children': [], 'id': 3}], 'id': 1}] 

「すべて」の値を削除する必要があります。ここに私のコードは次のとおりです。

for items in sub_tree_dicts: 
    del_null(items['children']) 

def del_null(childrens): 
    for child in childrens: 
     if child is None: 
      childrens.remove(child) 
     else: 
      del_null(child['children']) 

残念ながら、コードが期待どおりに動作し、リストからのみ最初の「なし」を削除しません。どこが間違っていますか?

Thanx。

+3

辞書を繰り返している間は、辞書を変更しないでください。あなたの 'childrens.remove(child)'があなたのforループを壊しています。 – MCBama

+0

'json.dumps()'が 'null'に変更されるため、JSONに変換するときに' None'を削除する必要はありません...? – mrCarnivore

+0

@ juanpa.arrivillaga:そうです。私は私のコメントを修正しました。 – mrCarnivore

答えて

0

リストを反復している間は、辞書/リスト/ etcを変更しないでください。ループがどこに行くべきか分からないように参照を壊すことができます。

for items in sub_tree_dicts: 
    del_null(items['children']) 

def del_null(childrens): 
    invalid_children = [] 
    for child in childrens: 
     if child is None: 
      invalid_children.append(child) 
     else: 
      del_null(child['children']) 
    for child in invalid_children: 
     childrens.remove(child) 
+0

ありがとうございます。あなたは私の仕事を救った。 – umaru

0

あなたはこれを試すことができます:

s = [{'text': 'Root', 'children': [{'text': 'X', 'children': [None, None], 'id': 2}, {'text': 'Y', 'children': [], 'id': 3}], 'id': 1}] 
d = {} 
def filter_none(s, last=None): 
    if last: 
     new_list = [{a:[i for i in b if i is not None] if isinstance(b, list) else b for a, b in c.items()} for c in s] 
     return new_list 
    for a, b in s.items(): 
     if not isinstance(b, list): 
     d[a] = b 
     else: 
     d[a] = filter_none(b, last=a) 

filter_none(s[0]) 
new_d = [d] 

出力を

は、私はそこに良い方法はありますが、私はあなたのコードはあまり変更せずにそれを行うような方法がこれですかなり確信しています:

[{'text': 'Root', 'children': [{'text': 'X', 'children': [], 'id': 2}, {'text': 'Y', 'children': [], 'id': 3}], 'id': 1}] 
+0

いい主人。ここでは効率が上がっていると思いますが、私は経験豊富なPythonユーザーです。ここでの読みやすさは非常に粗いので、xDで何が起こっているか把握するのにも時間がかかります。 – MCBama

関連する問題