Search code examples
pythoncsvdictionaryfloor

Trying to print percentages from nested dictionaries


I had a work around for this, but I've created a minimalistic code that SHOULD work, but it isn't. I say "should" because when I used the portion of the code where I divided, multiplied by 100, and printed using the "{0:.0f}% with my old code, it worked. However, I think I've tried something too conceptual

import csv, itertools
from math import floor
filename = 'denton_housing.csv'
denton_housing = {}

def create_nested_housing_dict():
    with open(filename, 'r', encoding='utf8', newline='') as f:
        for row in csv.DictReader(f, delimiter=','):
            try:
                denton_housing[row['year']][row['title_field']] = int(row['value'])
            except KeyError:
                denton_housing[row['year']] = {}
    return denton_housing

data = create_nested_housing_dict()


for key, value in data.items():
    print(key + '         ' + "{0:.0f}%".format(int(value['Vacant Housing Units'])) / \
        int(value['Total Housing Units']) * 100 + key + '         ' + \
        "{0:.0f}%".format(int(value['Occupied Housing Units'])) / \
        int(value['Total Housing Units']) * 100)

All this gives me is this:

Traceback (most recent call last):
  File "Dictest.py", line 37, in <module>
    int(value['Total Housing Units']) * 100 + key + '         ' + \
KeyError: 'Total Housing Units'

Here is my csv:

year,title_field,value
2014,Total Housing Units,49109
2014,Vacant Housing Units,2814
2014,Occupied Housing Units,46295
2013,Total Housing Units,47888
2013,Vacant Housing Units,4215
2013,Occupied Housing Units,43673
2012,Total Housing Units,45121
2012,Vacant Housing Units,3013
2012,Occupied Housing Units,42108
2011,Total Housing Units,44917
2011,Vacant Housing Units,4213
2011,Occupied Housing Units,40704
2010,Total Housing Units,44642
2010,Vacant Housing Units,3635
2010,Occupied Housing Units,41007
2009,Total Housing Units,39499
2009,Vacant Housing Units,3583
2009,Occupied Housing Units,35916
2008,Total Housing Units,41194
2008,Vacant Housing Units,4483
2008,Occupied Housing Units,36711

Solution

  • This should help. The key 'Total Housing Units' is not getting stored in your 'denton_housing' dictionary.

    Demo

    import csv, itertools
    from math import floor
    filename = 'denton_housing.csv'
    denton_housing = {}
    
    def create_nested_housing_dict():
        with open(filename, 'r', encoding='utf8', newline='') as f:
            for row in csv.DictReader(f, delimiter=','):
                if row['year'] not in denton_housing:   #UPDATE
                    denton_housing[row['year']] = {}
                try:
                    denton_housing[row['year']][row['title_field']] = int(row['value'])
                except KeyError:
                    denton_housing[row['year']] = {}
        return denton_housing
    
    data = create_nested_housing_dict()
    
    
    for key, value in data.items():
        print(key + '         ' + "{0:.0f}%".format(int(value['Vacant Housing Units'])) / \
            int(value['Total Housing Units']) * 100 + key + '         ' + \
            "{0:.0f}%".format(int(value['Occupied Housing Units'])) / \
            int(value['Total Housing Units']) * 100)