I have a list of dictionaries shaped like this:
[{'country': 'Afghanistan', 'continent': 'Asia', '1990': 500, '1990_lower': 200, '1990_upper': 1000, '1991': 500, '1991_lower': 200, '1991_upper': 1000, '1992': 500, '1992_lower': 200, '1992_upper': 1000, '1993': 1000, '1993_lower': 500, '1993_upper': 1100, '1994': 1000, '1994_lower': 500, '1994_upper': 1300, '1995': 1000, '1995_lower': 500, '1995_upper': 1600, '1996': 1000, '1996_lower': 500, '1996_upper': 1900, '1997': 1000, '1997_lower': 500, '1997_upper': 2100, '1998': 1200, '1998_lower': 1000, '1998_upper': 2500, '1999': 1300, '1999_lower': 1000, '1999_upper': 3000, '2000': 1500, '2000_lower': 1000, '2000_upper': 3600, '2001': 1800, '2001_lower': 1000, '2001_upper': 4100, '2002': 2000, '2002_lower': 1100, '2002_upper': 4800, '2003': 2300, '2003_lower': 1300, '2003_upper': 5700, '2004': 2600, '2004_lower': 1400, '2004_upper': 7000, '2005': 2900, '2005_lower': 1500, '2005_upper': 7200, '2006': 3200, '2006_lower': 1700, '2006_upper': 7900, '2007': 3500, '2007_lower': 1800, '2007_upper': 8300, '2008': 3800, '2008_lower': 2000, '2008_upper': 8900, '2009': 4200, '2009_lower': 2100, '2009_upper': 9600, '2010': 4600, '2010_lower': 2300, '2010_upper': 11000, '2011': 5100, '2011_lower': 2500, '2011_upper': 12000, '2012': 5600, '2012_lower': 2700, '2012_upper': 14000, '2013': 6300, '2013_lower': 3100, '2013_upper': 16000, '2014': 6900, '2014_lower': 3300, '2014_upper': 18000, '2015': 7600, '2015_lower': 3600, '2015_upper': 21000, '2016': 8400, '2016_lower': 3900, '2016_upper': 24000, '2017': 9200, '2017_lower': 4100, '2017_upper': 28000, '2018': 10000, '2018_lower': 4300, '2018_upper': 33000, '2019': 11000, '2019_lower': 4500, '2019_upper': 38000, '2020': 12000, '2020_lower': 4700, '2020_upper': 43000}, {'country': 'Albania', 'continent': 'Europe', '1990': 100, '1990_lower': 100, '1990_upper': 100, '1991': 100, '1991_lower': 100, '1991_upper': 100, '1992': 100, '1992_lower': 100, '1992_upper': 100, '1993': 100, '1993_lower': 100, '1993_upper': 100, '1994': 100, '1994_lower': 100, '1994_upper': 100, '1995': 100, '1995_lower': 100, '1995_upper': 100, '1996': 100, '1996_lower': 100, '1996_upper': 100, '1997': 100, '1997_lower': 100, '1997_upper': 100, '1998': 100, '1998_lower': 100, '1998_upper': 100, '1999': 100, '1999_lower': 100, '1999_upper': 200, '2000': 100, '2000_lower': 100, '2000_upper': 200, '2001': 200, '2001_lower': 100, '2001_upper': 200, '2002': 200, '2002_lower': 200, '2002_upper': 200, '2003': 200, '2003_lower': 200, '2003_upper': 500, '2004': 500, '2004_lower': 200, '2004_upper': 500, '2005': 500, '2005_lower': 500, '2005_upper': 500, '2006': 500, '2006_lower': 500, '2006_upper': 500, '2007': 500, '2007_lower': 500, '2007_upper': 500, '2008': 500, '2008_lower': 500, '2008_upper': 1000, '2009': 1000, '2009_lower': 500, '2009_upper': 1000, '2010': 1000, '2010_lower': 1000, '2010_upper': 1000, '2011': 1000, '2011_lower': 1000, '2011_upper': 1000, '2012': 1000, '2012_lower': 1000, '2012_upper': 1000, '2013': 1000, '2013_lower': 1000, '2013_upper': 1000, '2014': 1000, '2014_lower': 1000, '2014_upper': 1100, '2015': 1100, '2015_lower': 1000, '2015_upper': 1200, '2016': 1200, '2016_lower': 1000, '2016_upper': 1300, '2017': 1300, '2017_lower': 1100, '2017_upper': 1400, '2018': 1300, '2018_lower': 1100, '2018_upper': 1500, '2019': 1400, '2019_lower': 1200, '2019_upper': 1600, '2020': 1400, '2020_lower': 1200, '2020_upper': 1700}, {'country': 'Algeria', 'continent': 'Africa', '1990': 500, '1990_lower': 500, '1990_upper': 500, '1991': 500, '1991_lower': 500, '1991_upper': 1000, '1992': 1000, '1992_lower': 500, '1992_upper': 1000, '1993': 1000, '1993_lower': 1000, '1993_upper': 1000, '1994': 1000, '1994_lower': 1000, '1994_upper': 1000, '1995': 1000, '1995_lower': 1000, '1995_upper': 1100, '1996': 1100, '1996_lower': 1000, '1996_upper': 1200, '1997': 1300, '1997_lower': 1100, '1997_upper': 1400, '1998': 1500, '1998_lower': 1300, '1998_upper': 1600, '1999': 1700, '1999_lower': 1500, '1999_upper': 1900, '2000': 2000, '2000_lower': 1800, '2000_upper': 2200, '2001': 2200, '2001_lower': 2000, '2001_upper': 2500, '2002': 2500, '2002_lower': 2300, '2002_upper': 2800, '2003': 2800, '2003_lower': 2600, '2003_upper': 3200, '2004': 3200, '2004_lower': 2900, '2004_upper': 3500, '2005': 3500, '2005_lower': 3200, '2005_upper': 3900, '2006': 3900, '2006_lower': 3600, '2006_upper': 4300, '2007': 4300, '2007_lower': 4000, '2007_upper': 4700, '2008': 4700, '2008_lower': 4400, '2008_upper': 5100, '2009': 5200, '2009_lower': 4800, '2009_upper': 5600, '2010': 5800, '2010_lower': 5300, '2010_upper': 6200, '2011': 6500, '2011_lower': 5900, '2011_upper': 7000, '2012': 7300, '2012_lower': 6700, '2012_upper': 7900, '2013': 8200, '2013_lower': 7500, '2013_upper': 8900, '2014': 9400, '2014_lower': 8700, '2014_upper': 10000, '2015': 11000, '2015_lower': 10000, '2015_upper': 12000, '2016': 12000, '2016_lower': 11000, '2016_upper': 14000, '2017': 14000, '2017_lower': 13000, '2017_upper': 15000, '2018': 15000, '2018_lower': 14000, '2018_upper': 17000, '2019': 17000, '2019_lower': 16000, '2019_upper': 18000, '2020': 18000, '2020_lower': 17000, '2020_upper': 20000}, {'country': 'Angola', 'continent': 'Africa', '1990': 12000, '1990_lower': 6200, '1990_upper': 22000, '1991': 15000, '1991_lower': 8500, '1991_upper': 26000, '1992': 20000, '1992_lower': 12000, '1992_upper': 32000, '1993': 25000, '1993_lower': 16000, '1993_upper': 39000, '1994': 31000, '1994_lower': 20000, '1994_upper': 46000, '1995': 38000, '1995_lower': 26000, '1995_upper': 56000, '1996': 46000, '1996_lower': 33000, '1996_upper': 66000, '1997': 56000, '1997_lower': 41000, '1997_upper': 78000, '1998': 67000, '1998_lower': 49000, '1998_upper': 90000, '1999': 79000, '1999_lower': 60000, '1999_upper': 100000, '2000': 92000, '2000_lower': 70000, '2000_upper': 120000, '2001': 110000, '2001_lower': 83000, '2001_upper': 130000, '2002': 120000, '2002_lower': 97000, '2002_upper': 150000, '2003': 140000, '2003_lower': 110000, '2003_upper': 170000, '2004': 150000, '2004_lower': 120000, '2004_upper': 190000, '2005': 170000, '2005_lower': 140000, '2005_upper': 200000, '2006': 190000, '2006_lower': 150000, '2006_upper': 220000, '2007': 200000, '2007_lower': 160000, '2007_upper': 240000, '2008': 220000, '2008_lower': 180000, '2008_upper': 260000, '2009': 230000, '2009_lower': 190000, '2009_upper': 270000, '2010': 250000, '2010_lower': 200000, '2010_upper': 290000, '2011': 260000, '2011_lower': 210000, '2011_upper': 310000, '2012': 270000, '2012_lower': 220000, '2012_upper': 320000, '2013': 290000, '2013_lower': 240000, '2013_upper': 330000, '2014': 300000, '2014_lower': 250000, '2014_upper': 340000, '2015': 310000, '2015_lower': 260000, '2015_upper': 360000, '2016': 320000, '2016_lower': 270000, '2016_upper': 370000, '2017': 320000, '2017_lower': 270000, '2017_upper': 380000, '2018': 330000, '2018_lower': 280000, '2018_upper': 390000, '2019': 340000, '2019_lower': 280000, '2019_upper': 390000, '2020': 340000, '2020_lower': 280000, '2020_upper': 400000}, {'country': 'Argentina', 'continent': 'America', '1990': 13000, '1990_lower': 10000, '1990_upper': 15000, '1991': 18000, '1991_lower': 15000, '1991_upper': 21000, '1992': 23000, '1992_lower': 20000, '1992_upper': 27000, '1993': 29000, '1993_lower': 25000, '1993_upper': 33000, '1994': 34000, '1994_lower': 30000, '1994_upper': 38000, '1995': 39000, '1995_lower': 34000, '1995_upper': 44000, '1996': 43000, '1996_lower': 38000, '1996_upper': 48000, '1997': 47000, '1997_lower': 42000, '1997_upper': 52000, '1998': 51000, '1998_lower': 45000, '1998_upper': 56000, '1999': 55000, '1999_lower': 49000, '1999_upper': 60000, '2000': 59000, '2000_lower': 53000, '2000_upper': 64000, '2001': 64000, '2001_lower': 57000, '2001_upper': 69000, '2002': 68000, '2002_lower': 61000, '2002_upper': 73000, '2003': 72000, '2003_lower': 65000, '2003_upper': 77000, '2004': 76000, '2004_lower': 69000, '2004_upper': 82000, '2005': 80000, '2005_lower': 73000, '2005_upper': 86000, '2006': 84000, '2006_lower': 76000, '2006_upper': 90000, '2007': 88000, '2007_lower': 80000, '2007_upper': 94000, '2008': 92000, '2008_lower': 84000, '2008_upper': 98000, '2009': 96000, '2009_lower': 88000, '2009_upper': 100000, '2010': 100000, '2010_lower': 92000, '2010_upper': 110000, '2011': 100000, '2011_lower': 95000, '2011_upper': 110000, '2012': 110000, '2012_lower': 99000, '2012_upper': 120000, '2013': 110000, '2013_lower': 100000, '2013_upper': 120000, '2014': 120000, '2014_lower': 110000, '2014_upper': 130000, '2015': 120000, '2015_lower': 110000, '2015_upper': 130000, '2016': 120000, '2016_lower': 110000, '2016_upper': 130000, '2017': 130000, '2017_lower': 120000, '2017_upper': 140000, '2018': 130000, '2018_lower': 120000, '2018_upper': 140000, '2019': 140000, '2019_lower': 120000, '2019_upper': 150000, '2020': 140000, '2020_lower': 130000, '2020_upper': 150000}, {'country': 'Armenia', 'continent': 'Europe', '1990': 100, '1990_lower': 100, '1990_upper': 100, '1991': 100, '1991_lower': 100, '1991_upper': 100, '1992': 100, '1992_lower': 100, '1992_upper': 100, '1993': 100, '1993_lower': 100, '1993_upper': 200, '1994': 100, '1994_lower': 100, '1994_upper': 500, '1995': 200, '1995_lower': 100, '1995_upper': 500, '1996': 200, '1996_lower': 100, '1996_upper': 1000, '1997': 500, '1997_lower': 200, '1997_upper': 1200, '1998': 500, '1998_lower': 500, '1998_upper': 1700, '1999': 1000, '1999_lower': 500, '1999_upper': 2200, '2000': 1100, '2000_lower': 1000, '2000_upper': 2600, '2001': 1500, '2001_lower': 1000, '2001_upper': 3000, '2002': 1900, '2002_lower': 1200, '2002_upper': 3300, '2003': 2400, '2003_lower': 1700, '2003_upper': 3900, '2004': 2800, '2004_lower': 2100, '2004_upper': 4300, '2005': 3200, '2005_lower': 2500, '2005_upper': 4500, '2006': 3500, '2006_lower': 2800, '2006_upper': 4700, '2007': 3700, '2007_lower': 3100, '2007_upper': 4800, '2008': 3800, '2008_lower': 3200, '2008_upper': 4900, '2009': 3800, '2009_lower': 3200, '2009_upper': 4800, '2010': 3900, '2010_lower': 3300, '2010_upper': 4800, '2011': 3900, '2011_lower': 3300, '2011_upper': 4800, '2012': 3900, '2012_lower': 3400, '2012_upper': 4700, '2013': 3900, '2013_lower': 3400, '2013_upper': 4600, '2014': 3900, '2014_lower': 3500, '2014_upper': 4600, '2015': 4000, '2015_lower': 3500, '2015_upper': 4600, '2016': 4100, '2016_lower': 3600, '2016_upper': 4700, '2017': 4200, '2017_lower': 3700, '2017_upper': 4800, '2018': 4400, '2018_lower': 3900, '2018_upper': 5000, '2019': 4500, '2019_lower': 4000, '2019_upper': 5300, '2020': 4800, '2020_lower': 4200, '2020_upper': 5600}, {'country': 'Australia', 'continent': 'Oceania', '1990': 9800, '1990_lower': 7800, '1990_upper': 12000, '1991': 11000, '1991_lower': 8400, '1991_upper': 13000, '1992': 11000, '1992_lower': 8800, '1992_upper': 13000, '1993': 11000, '1993_lower': 9100, '1993_upper': 14000, '1994': 12000, '1994_lower': 9300, '1994_upper': 14000, '1995': 12000, '1995_lower': 9300, '1995_upper': 14000, '1996': 12000, '1996_lower': 9300, '1996_upper': 14000, '1997': 12000, '1997_lower': 9700, '1997_upper': 14000, '1998': 13000, '1998_lower': 10000, '1998_upper': 15000, '1999': 13000, '1999_lower': 11000, '1999_upper': 16000, '2000': 14000, '2000_lower': 11000, '2000_upper': 16000, '2001': 14000, '2001_lower': 12000, '2001_upper': 17000, '2002': 15000, '2002_lower': 12000, '2002_upper': 17000, '2003': 16000, '2003_lower': 13000, '2003_upper': 18000, '2004': 16000, '2004_lower': 13000, '2004_upper': 18000, '2005': 17000, '2005_lower': 14000, '2005_upper': 19000, '2006': 17000, '2006_lower': 14000, '2006_upper': 20000, '2007': 18000, '2007_lower': 15000, '2007_upper': 20000, '2008': 19000, '2008_lower': 16000, '2008_upper': 21000, '2009': 20000, '2009_lower': 16000, '2009_upper': 22000, '2010': 21000, '2010_lower': 17000, '2010_upper': 23000, '2011': 22000, '2011_lower': 18000, '2011_upper': 24000, '2012': 23000, '2012_lower': 19000, '2012_upper': 25000, '2013': 24000, '2013_lower': 19000, '2013_upper': 27000, '2014': 25000, '2014_lower': 20000, '2014_upper': 28000, '2015': 26000, '2015_lower': 21000, '2015_upper': 29000, '2016': 26000, '2016_lower': 22000, '2016_upper': 30000, '2017': 27000, '2017_lower': 22000, '2017_upper': 31000, '2018': 28000, '2018_lower': 23000, '2018_upper': 32000, '2019': 29000, '2019_lower': 23000, '2019_upper': 33000, '2020': 30000, '2020_lower': 24000, '2020_upper': 34000}, {'country': 'Austria', 'continent': 'Europe', '1990': -1, '1990_lower': -1, '1990_upper': -1, '1991': -1, '1991_lower': -1, '1991_upper': -1, '1992': -1, '1992_lower': -1, '1992_upper': -1, '1993': -1, '1993_lower': -1, '1993_upper': -1, '1994': -1, '1994_lower': -1, '1994_upper': -1, '1995': -1, '1995_lower': -1, '1995_upper': -1, '1996': -1, '1996_lower': -1, '1996_upper': -1, '1997': -1, '1997_lower': -1, '1997_upper': -1, '1998': -1, '1998_lower': -1, '1998_upper': -1, '1999': -1, '1999_lower': -1, '1999_upper': -1, '2000': -1, '2000_lower': -1, '2000_upper': -1, '2001': -1, '2001_lower': -1, '2001_upper': -1, '2002': -1, '2002_lower': -1, '2002_upper': -1, '2003': -1, '2003_lower': -1, '2003_upper': -1, '2004': -1, '2004_lower': -1, '2004_upper': -1, '2005': -1, '2005_lower': -1, '2005_upper': -1, '2006': -1, '2006_lower': -1, '2006_upper': -1, '2007': -1, '2007_lower': -1, '2007_upper': -1, '2008': -1, '2008_lower': -1, '2008_upper': -1, '2009': -1, '2009_lower': -1, '2009_upper': -1, '2010': -1, '2010_lower': -1, '2010_upper': -1, '2011': -1, '2011_lower': -1, '2011_upper': -1, '2012': -1, '2012_lower': -1, '2012_upper': -1, '2013': -1, '2013_lower': -1, '2013_upper': -1, '2014': -1, '2014_lower': -1, '2014_upper': -1, '2015': -1, '2015_lower': -1, '2015_upper': -1, '2016': -1, '2016_lower': -1, '2016_upper': -1, '2017': -1, '2017_lower': -1, '2017_upper': -1, '2018': -1, '2018_lower': -1, '2018_upper': -1, '2019': -1, '2019_lower': -1, '2019_upper': -1, '2020': -1, '2020_lower': -1, '2020_upper': -1},
I'm trying to write a function that looks through this list of dictionaries called dataset, and creates a new dictionary where the keys are all the continents that are in the dataset, and the values are nested dictionaries where the years are the keys (1990, 2020). The upper and lower are just estimations, and can be ignored in this problem. The values of this nested dictionary are the amount of cases per continent. My current code looks like this:
def compute_cases_per_continent():
final_dict: dict = {}
years: list = []
cases: list = []
for i in range(1990,2021):
years.append(i)
cases.append(0)
years_cases: dict = dict(zip(years,cases))
for i in dataset:
if i['continent'] not in final_dict:
final_dict.update({i['continent']: years_cases})
for dictionary in dataset:
if dictionary['continent'] in final_dict.keys():
for x in years:
years_cases[x] = dictionary[x]
print(final_dict)
But I am currently getting the following error;
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-29-1c63542122fe> in <module>
18 #// END_TODO [3.a_sub-saharan_africa]
19
---> 20 compute_cases_per_continent()
<ipython-input-29-1c63542122fe> in compute_cases_per_continent()
14 if dictionary['continent'] in final_dict.keys():
15 for x in years:
---> 16 years_cases[x] = dictionary[x]
17 print(final_dict)
18 #// END_TODO [3.a_sub-saharan_africa]
KeyError: 1990
I tried the code above, but I do not really see what to change to make it work like it should.
CodePudding user response:
The error you get arises because your keys (years) are strings in dataset, but you try to access dictionary through an int (years_cases[x] = dictionary[x]
).
However there is another problem in your script: you are assigning the same years_cases dictionary to each of your continents, which will not give the result you are looking for. You could try something like this instead:
final_dict: dict[str, dict[int, int]] = {
continent : {
year: sum(dic[str(year)] for dic in ld if dic['continent'] == continent) \
for year in range(1990, 2021)
} for continent in set([d['continent'] for d in ld])
}
print(final_dict)
CodePudding user response:
I think this one is a nicer solution:
final_dict = {}
for el in dataset:
final_dict[el['country']] = {k:v for k,v in el.items() if k.isdigit()}