как искать и получать доступ к подэлементу и структуре в python - PullRequest
0 голосов
/ 05 марта 2020

У меня есть этот dict (json) в python, и я хотел бы уменьшить его

{
   "M9D34X8ZHECCKKRU.JRTCKXETXF":{
      "priceDimensions":{
         "M9D34X8ZHECCKKRU.JRTCKXETXF.6YNURZBX9Y":{
            "unit":"GB-Mo",
            "endRange":"1024",
            "description":"$0.0240 per GB",
            "beginRange":"0",
            "pricePerUnit":{
               "USD":"0.0240000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.QUZRP4P8Y4":{
            "unit":"GB-Mo",
            "endRange":"51200",
            "description":"$0.0236 per GB",
            "beginRange":"1024",
            "pricePerUnit":{
               "USD":"0.0236000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.YJ98HAVVPP":{
            "unit":"GB-Mo",
            "endRange":"inf",
            "description":"$0.0228 per GB",
            "beginRange":"512000",
            "pricePerUnit":{
               "USD":"0.0228000000"
            }
         }
      },
      "sku":"M9D34X8ZHECCKKRU",
      "effectiveDate":"2019-11-01T00:00:00Z",
      "offerTermCode":"JRTCKXETXF",
      "termAttributes":{

      }
   }
}

Учитывая эту вышеупомянутую структуру, я хотел бы просто вернуть "priceDimensions" без этих "M9D34X8ZHECCKKRU. .. "tags.

{
   "priceDimensions":[
      {
         "unit":"GB-Mo",
         "endRange":"1024",
         "description":"$0.0240 per GB",
         "beginRange":"0",
         "pricePerUnit":{
            "USD":"0.0240000000"
         }
      },
      {
         "unit":"GB-Mo",
         "endRange":"51200",
         "description":"$0.0236 per GB",
         "beginRange":"1024",
         "pricePerUnit":{
            "USD":"0.0236000000"
         }
      },
      {
         "unit":"GB-Mo",
         "endRange":"inf",
         "description":"$0.0228 per GB",
         "beginRange":"512000",
         "pricePerUnit":{
            "USD":"0.0228000000"
         }
      }
   ]
}

Мне бы пришлось искать в нем, чтобы найти pricePerUnit для значения в диапазоне (между beginRange и endRange)

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Мне немного неясно, что вы ищете, но это должно дать вам json без тегов:

new_json = {'M9D34X8ZHECCKKRU.JRTCKXETXF':{'priceDimensions':[*your_json['M9D34X8ZHECCKKRU.JRTCKXETXF']['priceDimensions'].values()]}}
# or, if you want to get rid of M9D34X8ZHECCKKRU.JRTCKXETXF too
new_json = {'priceDimensions':[*your_json['M9D34X8ZHECCKKRU.JRTCKXETXF']['priceDimensions'].values()]}

РЕДАКТИРОВАТЬ: так как первый ключ является переменным, давайте итерируем и добавьте его в список

# New json with multiple first keys
your_json = {
   "M9D34X8ZHECCKKRU.JRTCKXETXF1":{
      "priceDimensions":{
         "M9D34X8ZHECCKKRU.JRTCKXETXF.6YNURZBX9Y":{
            "unit":"GB-Mo",
            "endRange":"1024",
            "description":"$0.0240 per GB",
            "beginRange":"0",
            "pricePerUnit":{
               "USD":"0.0240000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.QUZRP4P8Y4":{
            "unit":"GB-Mo",
            "endRange":"51200",
            "description":"$0.0236 per GB",
            "beginRange":"1024",
            "pricePerUnit":{
               "USD":"0.0236000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.YJ98HAVVPP":{
            "unit":"GB-Mo",
            "endRange":"inf",
            "description":"$0.0228 per GB",
            "beginRange":"512000",
            "pricePerUnit":{
               "USD":"0.0228000000"
            }
         }
      },
      "sku":"M9D34X8ZHECCKKRU",
      "effectiveDate":"2019-11-01T00:00:00Z",
      "offerTermCode":"JRTCKXETXF",
      "termAttributes":{

      }
   },
   "M9D34X8ZHECCKKRU.JRTCKXETXF2":{
      "priceDimensions":{
         "M9D34X8ZHECCKKRU.JRTCKXETXF.6YNURZBX9Y":{
            "unit":"GB-Mo",
            "endRange":"1024",
            "description":"$0.0240 per GB",
            "beginRange":"0",
            "pricePerUnit":{
               "USD":"0.0240000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.QUZRP4P8Y4":{
            "unit":"GB-Mo",
            "endRange":"51200",
            "description":"$0.0236 per GB",
            "beginRange":"1024",
            "pricePerUnit":{
               "USD":"0.0236000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.YJ98HAVVPP":{
            "unit":"GB-Mo",
            "endRange":"inf change",
            "description":"$0.0228 per GB change",
            "beginRange":"512000",
            "pricePerUnit":{
               "USD":"0.0228000000"
            }
         }
      },
      "sku":"M9D34X8ZHECCKKRU",
      "effectiveDate":"2019-11-01T00:00:00Z",
      "offerTermCode":"JRTCKXETXF",
      "termAttributes":{

      }
   }
}
# The for loop

upd8 = []

for k in your_json.keys():
  upd8.append({'priceDimensions':[*your_json[k]['priceDimensions'].values()]})

upd8

Надеюсь, это будет лучше для вашего варианта использования!

0 голосов
/ 05 марта 2020

Хорошо, я вернулся к выполнению циклов, и вот что я нашел, что работает.

   priceDimensions = []
    for k,v in l.items():
        for a,b in v['priceDimensions'].items():
            priceDimensions.append(b)

    print({'priceDimensions': priceDimensions})

Вот тестовый код;

import json

my_json = {
   "M9D34X8ZHECCKKRU.JRTCKXETXF":{
      "priceDimensions":{
         "M9D34X8ZHECCKKRU.JRTCKXETXF.6YNURZBX9Y":{
            "unit":"GB-Mo",
            "endRange":"1024",
            "description":"$0.0240 per GB",
            "beginRange":"0",
            "pricePerUnit":{
               "USD":"0.0240000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.QUZRP4P8Y4":{
            "unit":"GB-Mo",
            "endRange":"51200",
            "description":"$0.0236 per GB",
            "beginRange":"1024",
            "pricePerUnit":{
               "USD":"0.0236000000"
            }
         },
         "M9D34X8ZHECCKKRU.JRTCKXETXF.YJ98HAVVPP":{
            "unit":"GB-Mo",
            "endRange":"inf",
            "description":"$0.0228 per GB",
            "beginRange":"512000",
            "pricePerUnit":{
               "USD":"0.0228000000"
            }
         }
      },
      "sku":"M9D34X8ZHECCKKRU",
      "effectiveDate":"2019-11-01T00:00:00Z",
      "offerTermCode":"JRTCKXETXF",
      "termAttributes":{

      }
   }
}

priceDimensions = []
for k,v in my_json.items():
  for a,b in v['priceDimensions'].items():
    priceDimensions.append(b)

new_json = {'priceDimensions': priceDimensions}

print(new_json)

И вывод:

{
   "priceDimensions":[
      {
         "unit":"GB-Mo",
         "endRange":"1024",
         "description":"$0.0240 per GB",
         "beginRange":"0",
         "pricePerUnit":{
            "USD":"0.0240000000"
         }
      },
      {
         "unit":"GB-Mo",
         "endRange":"51200",
         "description":"$0.0236 per GB",
         "beginRange":"1024",
         "pricePerUnit":{
            "USD":"0.0236000000"
         }
      },
      {
         "unit":"GB-Mo",
         "endRange":"inf",
         "description":"$0.0228 per GB",
         "beginRange":"512000",
         "pricePerUnit":{
            "USD":"0.0228000000"
         }
      }
   ]
}
...