'How to add multiple values of an API dictionary to a new dictionary
I need to make a dictionary from three separate API datasets where the country is the key and the values are values from the datasets. The first code is done by my professor to add number of covid cases per county as the first value. I am being asked to add the number of total licensed beds per hospital, however, there are multiple hospitals per county, so how can I add the number of total licensed beds up so that only one value is reported per county?
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
Solution 1:[1]
Instead of:
if county in complete_dict:
complete_dict[county]['cases'] = int(cases)
else:
complete_dict[county] = {'cases': int(cases)}
do:
complete_dict.get(county, {'cases': 0})['cases'] += int(cases)
This way you're always adding the new cases values, starting from a default value of zero.
Another option is to make complete_dict
a nested collections.defaultdict
, so that every county
lookup produces a defaultdict(int)
that you can add arbitrary int values to:
from collections import defaultdict
complete_dict = defaultdict(lambda: defaultdict(int))
...
complete_dict[county]['cases'] += int(cases)
Solution 2:[2]
You could use collections.[Counter, defaultdict]
and 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()
Output:
{
"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
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Samwise |
Solution 2 |