我需要从三个独立的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
}
}