首页 > 解决方案 > 删除所有值为 N/A、- 或空字符串的键

问题描述

import json

def clean_data():
  r = requests.get('https://coderbyte.com/api/challenges/json/json-cleaning')
  return r.json()

print(clean_data())

示例输入

{"name":{"first":"Daniel","middle":"N/A","last":"Smith"},"age":45}

示例输出

{"name":{"first":"Daniel","last":"Smith"},"age":45}

标签: pythonjsondjango

解决方案


你可以递归地解决这个问题

import json
import requests


r = requests.get('https://coderbyte.com/api/challenges/json/json-cleaning')
data = r.json()

def clean_data(data):
    if(isinstance(data, dict)):
        to_be_deleted = []
        for k in data:
            if(isinstance(data[k], dict)):
                new_val = clean_data(data[k])
                data[k] = new_val
                
            if(isinstance(data[k], list)):
                new_val = clean_data(data[k])
                data[k] = new_val
                
            elif(isinstance(data[k], str)):
                if(data[k] == 'N/A'):
                    to_be_deleted.append(k)
                    
        for i in to_be_deleted:
            del data[i]
        return data
            
    if(isinstance(data, list)):
        to_be_deleted = []
        for i in range(len(data)):
            if(isinstance(data[i], dict)):
                new_val = clean_data(data[i])
                data[i] = new_val
                
            if(isinstance(data[i], list)):
                new_val = clean_data(data[k])
                data[i] = new_val
                
            elif(isinstance(data[i], str)):
                if(data[i] == 'N/A'):
                    to_be_deleted.append(i)
        for i in to_be_deleted:
            del data[i]
        return data
    
clean_data(data)
data = data = {"name":{"first":"Daniel","middle":"N/A","last":"Smith", "haha": {'hihi':1, "hoho":"N/A"}},"age":45, "hehe":[1,2,3,4,"N/A"]}
clean_data(data)
# {'name': {'first': 'Daniel', 'last': 'Smith', 'haha': {'hihi': 1}}, 'age': 45, 'hehe': [1, 2, 3, 4]}

推荐阅读