如何将API字典的多个值添加到新字典中

  • 本文关键字:字典 新字典 添加 API python
  • 更新时间 :
  • 英文 :


我需要从三个独立的API数据集制作字典,其中国家是关键,值是来自数据集的值。第一个代码是由我的教授完成的,将每个县的covid病例数添加为第一个值。系统要求我将每家医院的总许可床位数相加,但是,每个县有多家医院,因此如何将总许可床位数相加,以便每个县只报告一个值?

covid = "https://opendata.utah.gov/resource/y4r8-7n5m.json"
covid_api_response = requests.get(covid)
covid_data = covid_api_response.json()
hospital = "https://opendata.utah.gov/resource/ierb-h3t5.json"
hospital_api_response = requests.get(hospital)
hospital_data = hospital_api_response.json()
for item in covid_data:
     cases = item['confirmed']
     county = item['county'].upper()
     if county in complete_dict:
          complete_dict[county]['cases'] = int(cases)
     else:
          complete_dict[county] = {'cases': int(cases)}
for item in hospital_data:
     if len(item) <= 2:
     else:
          beds = item.get('total_licensed_beds')
     county = item.get('county')
     if county not in complete_dict:
          complete_dict[county] = {}
     if 'beds' not in complete_dict:
          complete_dict[county]['beds'] = beds

而不是:

     if county in complete_dict:
          complete_dict[county]['cases'] = int(cases)
     else:
          complete_dict[county] = {'cases': int(cases)}

:

    complete_dict.get(county, {'cases': 0})['cases'] += int(cases)

这样你总是添加新的case值,从默认值0开始。

另一个选择是使complete_dict成为嵌套的collections.defaultdict,这样每次county查找都会产生一个defaultdict(int),您可以向其添加任意int值:

from collections import defaultdict
complete_dict = defaultdict(lambda: defaultdict(int))
...
   complete_dict[county]['cases'] += int(cases)

您可以使用collections.[Counter, defaultdict]set.issubset:

import json
import requests
from collections import defaultdict, Counter

def main() -> None:
    complete_dict = defaultdict(lambda: Counter())
    covid = "https://opendata.utah.gov/resource/y4r8-7n5m.json"
    covid_api_response = requests.get(covid)
    covid_data = covid_api_response.json()
    for item in covid_data:
        if {'county', 'confirmed'}.issubset(item.keys()):
            county = item['county'].upper()
            cases = int(item['confirmed'])
            complete_dict[county]['cases'] += cases
    hospital = "https://opendata.utah.gov/resource/ierb-h3t5.json"
    hospital_api_response = requests.get(hospital)
    hospital_data = hospital_api_response.json()
    for item in hospital_data:
        if {'county', 'total_licensed_beds'}.issubset(item.keys()):
            county = item['county'].upper()
            beds = round(float(item['total_licensed_beds']))
            complete_dict[county]['beds'] += beds
    print(json.dumps(complete_dict, indent=4))

if __name__ == '__main__':
    main()

输出:

{
    "CARBON": {
        "cases": 2,
        "beds": 39
    },
    "GARFIELD": {
        "cases": 1,
        "beds": 36
    },
    "CACHE": {
        "cases": 36,
        "beds": 170
    },
    "WASHINGTON": {
        "cases": 45,
        "beds": 270
    },
    "SUMMIT": {
        "cases": 306,
        "beds": 40
    },
    "BOX ELDER": {
        "cases": 13,
        "beds": 74
    },
    "DAVIS": {
        "cases": 211,
        "beds": 481
    },
    "UINTAH": {
        "cases": 6,
        "beds": 39
    },
    "TOOELE": {
        "cases": 34,
        "beds": 47
    },
    "IRON": {
        "cases": 15,
        "beds": 50
    },
    "UTAH": {
        "cases": 335,
        "beds": 1372
    },
    "SALT LAKE": {
        "cases": 1187,
        "beds": 3607
    },
    "DUCHESNE": {
        "cases": 3,
        "beds": 49
    },
    "WASATCH": {
        "cases": 102,
        "beds": 19
    },
    "SAN JUAN": {
        "cases": 9,
        "beds": 36
    },
    "GRAND": {
        "cases": 1,
        "beds": 17
    },
    "WEBER": {
        "cases": 105,
        "beds": 606
    },
    "KANE": {
        "cases": 3,
        "beds": 25
    },
    "EMERY": {
        "cases": 3
    },
    "BEAVER": {
        "beds": 72
    },
    "JUAB": {
        "beds": 25
    },
    "MILLARD": {
        "beds": 37
    },
    "SANPETE": {
        "beds": 43
    },
    "SEVIER": {
        "beds": 29
    }
}

最新更新