首页 > 解决方案 > Python-如果在 JSON 中找不到元素,则用 0 更新值

问题描述

我有一个读取 JSON 文件结构并提取 Off_peak、Peak 和 Shoulder 价格的代码。有一些 JSON 存在所有元素,而其中一些只有 Peak 和 Off_Peak 但没有肩部。

try:
    for check in data[0]['planData']['contract'][0]['tariffPeriod'][0]['touBlock']:
        if "Off" in check['name']:
            Off_Peak = check['blockRate'][0]['unitPrice']
        elif "Peak" in check['name']:
            Peak = check['blockRate'][0]['unitPrice']
        elif "Shoulder" in check['name']:
            Shoulder = check['blockRate'][0]['unitPrice']
        
except:
    Off_Peak = ""
    Peak = ""
    Shoulder = ""

我的代码检查并使用所有这些元素更新变量,甚至发现与否。但是,如果只找到 2 个元素,则未找到的元素不会更新,我想用 0.Example of API 更新它

API - https://api.energymadeeasy.gov.au/plans/dpids/AMA62448MBE1?postcode=4000

例如,有一个文件有 Off_Peak 和 Peak 但肩变量保持空白,但如果找不到,我想用 0 更新它。我尝试了下面的代码,但它不起作用。

for check in data[0]['planData']['contract'][0]['tariffPeriod'][0]['touBlock']:
    if "Off" in check['description']:
        Off_Peak = check['blockRate'][0]['unitPrice']
        print('Off_Peak',Off_Peak)
    elif "Peak" in check['description']:
        Peak = check['blockRate'][0]['unitPrice']
        print('Peak',Peak)
    elif "Shoulder" in check['description']:
        Shoulder = check['blockRate'][0]['unitPrice']
        print('Shoulder',Shoulder)
    elif Off_Peak==None:
        Off_Peak=0
    elif Peak==None:
        Peak=0
    elif Shoulder==None:
        Shoulder=0

预期产出

Plan_ID Post_Code   Plan_Type   Plan_Name   Retailer_Name   Retailer_Code   Distributor_Name    State   Effective_Date  Solar_Rate  Discount_Type   Discount    Daily_Rate  CL1 CL2 Single_Rate Off_Peak    Peak    Shoulder
AMA62448MBE1    4000    TOU amaysim Post-paid Electricity - Business    amaysim Energy  AMA Energex QLD 1/07/2020   8           136.8               21.9648 23.328  0

标签: pythonpython-3.xdataframe

解决方案


我认为没有必要使这一点复杂化,只需将所有 3 的初始值设置为 0。如果找到值,则再次设置它,否则它将保持 0 -

Off_Peak = 0
Peak = 0
Shoulder = 0
try:
    for check in data[0]['planData']['contract'][0]['tariffPeriod'][0]['touBlock']:
        if "Off" in check['name']:
            Off_Peak = check['blockRate'][0]['unitPrice']
        elif "Peak" in check['name']:
            Peak = check['blockRate'][0]['unitPrice']
        elif "Shoulder" in check['name']:
            Shoulder = check['blockRate'][0]['unitPrice']        
except:
    # No need to set it again, but not removing it
    Off_Peak = 0
    Peak = 0
    Shoulder = 0

推荐阅读