Exercise Book 2

Covering the materials of Chapters 7-8.
Topics: collection data structures, object oriented programming

In the following 4 lists you will find the country name, capital city name, area (in km2) and population (in millions) data for 43 European countries respectively.

In [1]:
countries = ['Albania', 'Andorra', 'Austria', 'Belgium', 'Bosnia and Herzegovina', 'Bulgaria', 'Czech Republic', 'Denmark', 'United Kingdom', 'Estonia', 'Belarus', 'Finland', 'France', 'Greece', 'Netherlands', 'Croatia', 'Ireland', 'Iceland', 'Kosovo', 'Poland', 'Latvia', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Macedonia', 'Hungary', 'Malta', 'Moldova', 'Monaco', 'Montenegro', 'Germany', 'Norway', 'Italy', 'Portugal', 'Romania', 'San Marino', 'Spain', 'Switzerland', 'Sweden', 'Serbia', 'Slovakia', 'Slovenia', 'Ukraine']
capitals = ['Tirana', 'Andorra la Vella', 'Vienna', 'Brussels', 'Sarajevo', 'Sofia', 'Prague', 'Copenhagen', 'London', 'Tallin', 'Minsk', 'Helsinki', 'Paris', 'Athens', 'Hague', 'Zagreb', 'Dublin', 'Reykjavik', 'Prishtina', 'Warsaw', 'Riga', 'Vaduz', 'Vilnius', 'luxembourg', 'Skopje', 'Budapest', 'Valletta', 'Chisinau', 'Monaco', 'Podgorica', 'Berlin', 'Oslo', 'Rome', 'Lisbon', 'Bucharest', 'San Marino', 'Madrid', 'Berne', 'Stockholm', 'Belgrade', 'Bratislava', 'Ljubljana', 'Kiev']
areas = [28748, 468, 83857, 30519, 51130, 110912, 78864, 43077, 244100, 45100, 207600, 338145, 543965, 131957, 33933, 56500, 70283, 103000, 10887, 312683, 63700, 160, 65200, 2586, 25713, 93036, 316, 33700, 2, 13812, 357042, 323877, 301277, 92389, 237500, 61, 504782, 41293, 449964, 66577, 49035, 20250, 603700]
populations = [3.2, 0.07, 7.6, 10.0, 4.5, 9.0, 10.4, 5.1, 57.2, 1.6, 10.3, 4.9, 56.2, 10.0, 14.8, 4.7, 3.5, 0.3, 2.2, 37.8, 2.6, 0.03, 3.6, 0.4, 2.1, 10.4, 0.3, 4.4, 0.03, 0.6, 78.6, 4.2, 57.5, 10.5, 23.2, 0.03, 38.8, 6.7, 8.5, 7.2, 5.3, 2.0, 51.8]

Let's display the data stored in all lists:

In [2]:
print("Countries:")
print(countries)
print("----------")
print("Capitals:")
print(capitals)
print("----------")
print("Areas (in km2):")
print(areas)
print("----------")
print("Populations (in millions):")
print(populations)
Countries:
['Albania', 'Andorra', 'Austria', 'Belgium', 'Bosnia and Herzegovina', 'Bulgaria', 'Czech Republic', 'Denmark', 'United Kingdom', 'Estonia', 'Belarus', 'Finland', 'France', 'Greece', 'Netherlands', 'Croatia', 'Ireland', 'Iceland', 'Kosovo', 'Poland', 'Latvia', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Macedonia', 'Hungary', 'Malta', 'Moldova', 'Monaco', 'Montenegro', 'Germany', 'Norway', 'Italy', 'Portugal', 'Romania', 'San Marino', 'Spain', 'Switzerland', 'Sweden', 'Serbia', 'Slovakia', 'Slovenia', 'Ukraine']
----------
Capitals:
['Tirana', 'Andorra la Vella', 'Vienna', 'Brussels', 'Sarajevo', 'Sofia', 'Prague', 'Copenhagen', 'London', 'Tallin', 'Minsk', 'Helsinki', 'Paris', 'Athens', 'Hague', 'Zagreb', 'Dublin', 'Reykjavik', 'Prishtina', 'Warsaw', 'Riga', 'Vaduz', 'Vilnius', 'luxembourg', 'Skopje', 'Budapest', 'Valletta', 'Chisinau', 'Monaco', 'Podgorica', 'Berlin', 'Oslo', 'Rome', 'Lisbon', 'Bucharest', 'San Marino', 'Madrid', 'Berne', 'Stockholm', 'Belgrade', 'Bratislava', 'Ljubljana', 'Kiev']
----------
Areas (in km2):
[28748, 468, 83857, 30519, 51130, 110912, 78864, 43077, 244100, 45100, 207600, 338145, 543965, 131957, 33933, 56500, 70283, 103000, 10887, 312683, 63700, 160, 65200, 2586, 25713, 93036, 316, 33700, 2, 13812, 357042, 323877, 301277, 92389, 237500, 61, 504782, 41293, 449964, 66577, 49035, 20250, 603700]
----------
Populations (in millions):
[3.2, 0.07, 7.6, 10.0, 4.5, 9.0, 10.4, 5.1, 57.2, 1.6, 10.3, 4.9, 56.2, 10.0, 14.8, 4.7, 3.5, 0.3, 2.2, 37.8, 2.6, 0.03, 3.6, 0.4, 2.1, 10.4, 0.3, 4.4, 0.03, 0.6, 78.6, 4.2, 57.5, 10.5, 23.2, 0.03, 38.8, 6.7, 8.5, 7.2, 5.3, 2.0, 51.8]

The index position of the elements in the lists ties the information for each country together:

In [3]:
for idx in range(len(countries)):
    print("Name: %s, Capital: %s, Area: %d km2, Population: %.2f millions" % (countries[idx], capitals[idx], areas[idx], populations[idx]))
Name: Albania, Capital: Tirana, Area: 28748 km2, Population: 3.20 millions
Name: Andorra, Capital: Andorra la Vella, Area: 468 km2, Population: 0.07 millions
Name: Austria, Capital: Vienna, Area: 83857 km2, Population: 7.60 millions
Name: Belgium, Capital: Brussels, Area: 30519 km2, Population: 10.00 millions
Name: Bosnia and Herzegovina, Capital: Sarajevo, Area: 51130 km2, Population: 4.50 millions
Name: Bulgaria, Capital: Sofia, Area: 110912 km2, Population: 9.00 millions
Name: Czech Republic, Capital: Prague, Area: 78864 km2, Population: 10.40 millions
Name: Denmark, Capital: Copenhagen, Area: 43077 km2, Population: 5.10 millions
Name: United Kingdom, Capital: London, Area: 244100 km2, Population: 57.20 millions
Name: Estonia, Capital: Tallin, Area: 45100 km2, Population: 1.60 millions
Name: Belarus, Capital: Minsk, Area: 207600 km2, Population: 10.30 millions
Name: Finland, Capital: Helsinki, Area: 338145 km2, Population: 4.90 millions
Name: France, Capital: Paris, Area: 543965 km2, Population: 56.20 millions
Name: Greece, Capital: Athens, Area: 131957 km2, Population: 10.00 millions
Name: Netherlands, Capital: Hague, Area: 33933 km2, Population: 14.80 millions
Name: Croatia, Capital: Zagreb, Area: 56500 km2, Population: 4.70 millions
Name: Ireland, Capital: Dublin, Area: 70283 km2, Population: 3.50 millions
Name: Iceland, Capital: Reykjavik, Area: 103000 km2, Population: 0.30 millions
Name: Kosovo, Capital: Prishtina, Area: 10887 km2, Population: 2.20 millions
Name: Poland, Capital: Warsaw, Area: 312683 km2, Population: 37.80 millions
Name: Latvia, Capital: Riga, Area: 63700 km2, Population: 2.60 millions
Name: Liechtenstein, Capital: Vaduz, Area: 160 km2, Population: 0.03 millions
Name: Lithuania, Capital: Vilnius, Area: 65200 km2, Population: 3.60 millions
Name: Luxembourg, Capital: luxembourg, Area: 2586 km2, Population: 0.40 millions
Name: Macedonia, Capital: Skopje, Area: 25713 km2, Population: 2.10 millions
Name: Hungary, Capital: Budapest, Area: 93036 km2, Population: 10.40 millions
Name: Malta, Capital: Valletta, Area: 316 km2, Population: 0.30 millions
Name: Moldova, Capital: Chisinau, Area: 33700 km2, Population: 4.40 millions
Name: Monaco, Capital: Monaco, Area: 2 km2, Population: 0.03 millions
Name: Montenegro, Capital: Podgorica, Area: 13812 km2, Population: 0.60 millions
Name: Germany, Capital: Berlin, Area: 357042 km2, Population: 78.60 millions
Name: Norway, Capital: Oslo, Area: 323877 km2, Population: 4.20 millions
Name: Italy, Capital: Rome, Area: 301277 km2, Population: 57.50 millions
Name: Portugal, Capital: Lisbon, Area: 92389 km2, Population: 10.50 millions
Name: Romania, Capital: Bucharest, Area: 237500 km2, Population: 23.20 millions
Name: San Marino, Capital: San Marino, Area: 61 km2, Population: 0.03 millions
Name: Spain, Capital: Madrid, Area: 504782 km2, Population: 38.80 millions
Name: Switzerland, Capital: Berne, Area: 41293 km2, Population: 6.70 millions
Name: Sweden, Capital: Stockholm, Area: 449964 km2, Population: 8.50 millions
Name: Serbia, Capital: Belgrade, Area: 66577 km2, Population: 7.20 millions
Name: Slovakia, Capital: Bratislava, Area: 49035 km2, Population: 5.30 millions
Name: Slovenia, Capital: Ljubljana, Area: 20250 km2, Population: 2.00 millions
Name: Ukraine, Capital: Kiev, Area: 603700 km2, Population: 51.80 millions

Task 1: List of dictionaries

Storing the data in 4 separate lists is not comfortable. Construct a list of dictionaries programatically:

  • each item in the list is a dictionary;
  • each dictionary contains the relevant information for a single country.

The result should be like the following:

[
    {
        'country': 'Albania',
        'capital': 'Tirana',
        'area': 28748,
        'population': 3.2
    },

    ...

    {
        'country': 'Ukraine',
        'capital': 'Kiev',
        'area': 603700,
        'population': 51.8
    }
]
In [4]:
dataset = []
for idx in range(len(countries)):
    dataset.append({
        'country': countries[idx],
        'capital': capitals[idx],
        'area': areas[idx],
        'population': populations[idx]
    })
print(dataset)
[{'country': 'Albania', 'capital': 'Tirana', 'area': 28748, 'population': 3.2}, {'country': 'Andorra', 'capital': 'Andorra la Vella', 'area': 468, 'population': 0.07}, {'country': 'Austria', 'capital': 'Vienna', 'area': 83857, 'population': 7.6}, {'country': 'Belgium', 'capital': 'Brussels', 'area': 30519, 'population': 10.0}, {'country': 'Bosnia and Herzegovina', 'capital': 'Sarajevo', 'area': 51130, 'population': 4.5}, {'country': 'Bulgaria', 'capital': 'Sofia', 'area': 110912, 'population': 9.0}, {'country': 'Czech Republic', 'capital': 'Prague', 'area': 78864, 'population': 10.4}, {'country': 'Denmark', 'capital': 'Copenhagen', 'area': 43077, 'population': 5.1}, {'country': 'United Kingdom', 'capital': 'London', 'area': 244100, 'population': 57.2}, {'country': 'Estonia', 'capital': 'Tallin', 'area': 45100, 'population': 1.6}, {'country': 'Belarus', 'capital': 'Minsk', 'area': 207600, 'population': 10.3}, {'country': 'Finland', 'capital': 'Helsinki', 'area': 338145, 'population': 4.9}, {'country': 'France', 'capital': 'Paris', 'area': 543965, 'population': 56.2}, {'country': 'Greece', 'capital': 'Athens', 'area': 131957, 'population': 10.0}, {'country': 'Netherlands', 'capital': 'Hague', 'area': 33933, 'population': 14.8}, {'country': 'Croatia', 'capital': 'Zagreb', 'area': 56500, 'population': 4.7}, {'country': 'Ireland', 'capital': 'Dublin', 'area': 70283, 'population': 3.5}, {'country': 'Iceland', 'capital': 'Reykjavik', 'area': 103000, 'population': 0.3}, {'country': 'Kosovo', 'capital': 'Prishtina', 'area': 10887, 'population': 2.2}, {'country': 'Poland', 'capital': 'Warsaw', 'area': 312683, 'population': 37.8}, {'country': 'Latvia', 'capital': 'Riga', 'area': 63700, 'population': 2.6}, {'country': 'Liechtenstein', 'capital': 'Vaduz', 'area': 160, 'population': 0.03}, {'country': 'Lithuania', 'capital': 'Vilnius', 'area': 65200, 'population': 3.6}, {'country': 'Luxembourg', 'capital': 'luxembourg', 'area': 2586, 'population': 0.4}, {'country': 'Macedonia', 'capital': 'Skopje', 'area': 25713, 'population': 2.1}, {'country': 'Hungary', 'capital': 'Budapest', 'area': 93036, 'population': 10.4}, {'country': 'Malta', 'capital': 'Valletta', 'area': 316, 'population': 0.3}, {'country': 'Moldova', 'capital': 'Chisinau', 'area': 33700, 'population': 4.4}, {'country': 'Monaco', 'capital': 'Monaco', 'area': 2, 'population': 0.03}, {'country': 'Montenegro', 'capital': 'Podgorica', 'area': 13812, 'population': 0.6}, {'country': 'Germany', 'capital': 'Berlin', 'area': 357042, 'population': 78.6}, {'country': 'Norway', 'capital': 'Oslo', 'area': 323877, 'population': 4.2}, {'country': 'Italy', 'capital': 'Rome', 'area': 301277, 'population': 57.5}, {'country': 'Portugal', 'capital': 'Lisbon', 'area': 92389, 'population': 10.5}, {'country': 'Romania', 'capital': 'Bucharest', 'area': 237500, 'population': 23.2}, {'country': 'San Marino', 'capital': 'San Marino', 'area': 61, 'population': 0.03}, {'country': 'Spain', 'capital': 'Madrid', 'area': 504782, 'population': 38.8}, {'country': 'Switzerland', 'capital': 'Berne', 'area': 41293, 'population': 6.7}, {'country': 'Sweden', 'capital': 'Stockholm', 'area': 449964, 'population': 8.5}, {'country': 'Serbia', 'capital': 'Belgrade', 'area': 66577, 'population': 7.2}, {'country': 'Slovakia', 'capital': 'Bratislava', 'area': 49035, 'population': 5.3}, {'country': 'Slovenia', 'capital': 'Ljubljana', 'area': 20250, 'population': 2.0}, {'country': 'Ukraine', 'capital': 'Kiev', 'area': 603700, 'population': 51.8}]

Task 2: Population density

Calculate the population density for each country (in people / km2 unit) and extends each country with this information.

The result should be like the following:

[
    {
        'country': 'Albania',
        'capital': 'Tirana',
        'area': 28748,
        'population': 3.2,
        'density': 111.31209127591485
    },

    ...

    {
        'country': 'Ukraine',
        'capital': 'Kiev',
        'area': 603700,
        'population': 51.8,
        'density': 85.80420738777539
    }
]
In [5]:
for item in dataset:
    item['density'] = item['population'] * 1e6 / item['area']
print(dataset)
[{'country': 'Albania', 'capital': 'Tirana', 'area': 28748, 'population': 3.2, 'density': 111.31209127591485}, {'country': 'Andorra', 'capital': 'Andorra la Vella', 'area': 468, 'population': 0.07, 'density': 149.57264957264957}, {'country': 'Austria', 'capital': 'Vienna', 'area': 83857, 'population': 7.6, 'density': 90.63047807577185}, {'country': 'Belgium', 'capital': 'Brussels', 'area': 30519, 'population': 10.0, 'density': 327.66473344473934}, {'country': 'Bosnia and Herzegovina', 'capital': 'Sarajevo', 'area': 51130, 'population': 4.5, 'density': 88.01095247408567}, {'country': 'Bulgaria', 'capital': 'Sofia', 'area': 110912, 'population': 9.0, 'density': 81.14541257934218}, {'country': 'Czech Republic', 'capital': 'Prague', 'area': 78864, 'population': 10.4, 'density': 131.87259078920673}, {'country': 'Denmark', 'capital': 'Copenhagen', 'area': 43077, 'population': 5.1, 'density': 118.39264572741834}, {'country': 'United Kingdom', 'capital': 'London', 'area': 244100, 'population': 57.2, 'density': 234.33019254403933}, {'country': 'Estonia', 'capital': 'Tallin', 'area': 45100, 'population': 1.6, 'density': 35.47671840354767}, {'country': 'Belarus', 'capital': 'Minsk', 'area': 207600, 'population': 10.3, 'density': 49.614643545279385}, {'country': 'Finland', 'capital': 'Helsinki', 'area': 338145, 'population': 4.9, 'density': 14.490824941962767}, {'country': 'France', 'capital': 'Paris', 'area': 543965, 'population': 56.2, 'density': 103.3154706644729}, {'country': 'Greece', 'capital': 'Athens', 'area': 131957, 'population': 10.0, 'density': 75.7822624036618}, {'country': 'Netherlands', 'capital': 'Hague', 'area': 33933, 'population': 14.8, 'density': 436.1535967936817}, {'country': 'Croatia', 'capital': 'Zagreb', 'area': 56500, 'population': 4.7, 'density': 83.1858407079646}, {'country': 'Ireland', 'capital': 'Dublin', 'area': 70283, 'population': 3.5, 'density': 49.79867108689157}, {'country': 'Iceland', 'capital': 'Reykjavik', 'area': 103000, 'population': 0.3, 'density': 2.912621359223301}, {'country': 'Kosovo', 'capital': 'Prishtina', 'area': 10887, 'population': 2.2, 'density': 202.07587030403232}, {'country': 'Poland', 'capital': 'Warsaw', 'area': 312683, 'population': 37.8, 'density': 120.88920728021671}, {'country': 'Latvia', 'capital': 'Riga', 'area': 63700, 'population': 2.6, 'density': 40.816326530612244}, {'country': 'Liechtenstein', 'capital': 'Vaduz', 'area': 160, 'population': 0.03, 'density': 187.5}, {'country': 'Lithuania', 'capital': 'Vilnius', 'area': 65200, 'population': 3.6, 'density': 55.214723926380366}, {'country': 'Luxembourg', 'capital': 'luxembourg', 'area': 2586, 'population': 0.4, 'density': 154.67904098994586}, {'country': 'Macedonia', 'capital': 'Skopje', 'area': 25713, 'population': 2.1, 'density': 81.67075020417687}, {'country': 'Hungary', 'capital': 'Budapest', 'area': 93036, 'population': 10.4, 'density': 111.78468549808676}, {'country': 'Malta', 'capital': 'Valletta', 'area': 316, 'population': 0.3, 'density': 949.367088607595}, {'country': 'Moldova', 'capital': 'Chisinau', 'area': 33700, 'population': 4.4, 'density': 130.56379821958458}, {'country': 'Monaco', 'capital': 'Monaco', 'area': 2, 'population': 0.03, 'density': 15000.0}, {'country': 'Montenegro', 'capital': 'Podgorica', 'area': 13812, 'population': 0.6, 'density': 43.440486533449175}, {'country': 'Germany', 'capital': 'Berlin', 'area': 357042, 'population': 78.6, 'density': 220.14216814828507}, {'country': 'Norway', 'capital': 'Oslo', 'area': 323877, 'population': 4.2, 'density': 12.967885956705786}, {'country': 'Italy', 'capital': 'Rome', 'area': 301277, 'population': 57.5, 'density': 190.8542636842507}, {'country': 'Portugal', 'capital': 'Lisbon', 'area': 92389, 'population': 10.5, 'density': 113.6498933855762}, {'country': 'Romania', 'capital': 'Bucharest', 'area': 237500, 'population': 23.2, 'density': 97.6842105263158}, {'country': 'San Marino', 'capital': 'San Marino', 'area': 61, 'population': 0.03, 'density': 491.8032786885246}, {'country': 'Spain', 'capital': 'Madrid', 'area': 504782, 'population': 38.8, 'density': 76.86486443652903}, {'country': 'Switzerland', 'capital': 'Berne', 'area': 41293, 'population': 6.7, 'density': 162.25510377061488}, {'country': 'Sweden', 'capital': 'Stockholm', 'area': 449964, 'population': 8.5, 'density': 18.890400120898562}, {'country': 'Serbia', 'capital': 'Belgrade', 'area': 66577, 'population': 7.2, 'density': 108.14545563783288}, {'country': 'Slovakia', 'capital': 'Bratislava', 'area': 49035, 'population': 5.3, 'density': 108.08606097685326}, {'country': 'Slovenia', 'capital': 'Ljubljana', 'area': 20250, 'population': 2.0, 'density': 98.76543209876543}, {'country': 'Ukraine', 'capital': 'Kiev', 'area': 603700, 'population': 51.8, 'density': 85.80420738777539}]

Task 3: Highest density

Find the country with the highest population density.

In [6]:
max_idx = 0

for idx in range(1, len(dataset)):
    if dataset[idx]['density'] > dataset[max_idx]['density']:
        max_idx = idx
        
print(dataset[max_idx])
{'country': 'Monaco', 'capital': 'Monaco', 'area': 2, 'population': 0.03, 'density': 15000.0}

Task 4: Object oriented approach

Task A): define a class named Country, which can store a country's name, capitaly city, area and population. Construct a list of objects, where each object is an instance of the Country class.

Task B): add a density() method to the Country class, which calculates the population density for that country dynamically. Find the country with the highest population density.

In [7]:
class Country():
    def __init__(self, name, capital, area, population):
        self.name = name
        self.capital = capital
        self.area = area
        self.population = population
    
    def density(self):
        return self.population * 1e6 / self.area

dataset2 = []
for idx in range(len(countries)):
    dataset2.append(Country(countries[idx], capitals[idx], areas[idx], populations[idx]))
    
max_idx = 0
for idx in range(1, len(dataset2)):
    if dataset2[idx].density() > dataset2[max_idx].density():
        max_idx = idx
        
print(dataset2[max_idx].name)
Monaco