2017-12-12 14 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']) 

불행히도 코드는 예상대로 작동하지 않으며 목록에서 처음으로 '없음'만 제거됩니다. 내가 어디서 잘못한거야?

고맙습니다.

+3

사전을 반복하는 동안 수정하지 마십시오. 'childrens.remove (child)'가 for 루프를 깨고 있습니다. – MCBama

+0

'json.dumps()'가 JSON으로 변환하고자 할 때'None'을 제거 할 필요가 없다는 것을 알았습니까? – mrCarnivore

+0

@ juanpa.arrivillaga : 당신 말이 맞아요. 내 의견을 바로 잡았습니다. – mrCarnivore

답변

0

목록을 반복하는 동안 사전/목록/등을 수정하면 안됩니다. 루프가 어디로 가야할지 모를 수 있도록 참조를 끊을 수 있습니다.

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

좋은 주인. 여기에 능률을 올리려는 분도 계시지 만 저는 경험 많은 비단뱀 사용자입니다. 읽기 쉽기 때문에 xD에서 무슨 일이 일어나는지 알아 내려고합니다. – MCBama