【问题标题】:Remove all keys that have values of N/A, -, or empty strings [closed]删除所有值为 N/A、- 或空字符串的键 [关闭]
【发布时间】:2021-05-09 17:23:05
【问题描述】:
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}

【问题讨论】:

  • 你没有对响应做任何事情。清洁不会自行发生。
  • 另外,向 SO 寻求挑战的解决方案没有任何好处
  • 另外,您已经导入了json,但您没有使用它,而requests 在代码中但未导入。

标签: python json django


【解决方案1】:
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 j in data:
      if (isinstance(data[j], dict)):
        new_val = clean_data(data[j])
        data[j] = new_val

      if (isinstance(data[j], list)):
        new_val = clean_data(data[j])
        data[j] = new_val

      elif (isinstance(data[j], str)):
        if (data[j] == 'N/A' or data[j] == '-' or data[j] == ''):
          to_be_deleted.append(j)

    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[i])
        data[i] = new_val

      elif (isinstance(data[i], str)):
        if (data[i] == 'N/A' or data[i] == '-' or data[i] == ''):
          to_be_deleted.append(i)
    for i in to_be_deleted:
      del data[i]
    return data

print("Original Data : ",data)
print("Cleaned Data : ",clean_data(data))

输出:

原始数据:{'name': {'first': 'Robert', 'middle': '', 'last': 'Smith'}, 'age': 25, 'DOB': '-', '爱好':['跑步','编码','-'],'教育':{'高中':'N/A','大学':'耶鲁'}}

清理数据:{'name': {'first': 'Robert', 'last': 'Smith'}, 'age': 25, 'hobbies': ['running', 'coding'], '教育': {'college': '耶鲁'}}

【讨论】:

    【解决方案2】:

    这是我的解决方案:

    import requests
    import json
    
    def clean(data):
      for i in list(data):
        v = data[i]
        if type(v) == dict:
          clean(v)
        if type(v) == list:
          if '' in v:
            v.remove('')
          elif '-' in v:
            v.remove('-')
          elif 'N/A' in v:
            v.remove('N/A')
        if type(v) == str:
          if v in ['N/A', '', '-']:
            data.pop(i)
    
    def clean_data():
      r = requests.get('https://coderbyte.com/api/challenges/json/json-cleaning')
      print(json.dumps(r.json()))
      d = json.loads(r.text)
      clean(d)
      return json.dumps(d)
    

    【讨论】:

      【解决方案3】:

      你可以递归解决这个问题

      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]}
      

      【讨论】:

        猜你喜欢
        • 2022-08-23
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多