2.10. Einwohnerzahl Europa#

Bei dieser Aufgabe werden Sie sowohl Schleifen als auch Verzweigungen nutzen, um Daten aus einer Datei auszulesen und in sinvolle Datentypen abzuspeichern. In der Bonusaufgabe werden Sie einen Filter auf die Daten anwenden und eine Berechnung mit ihnen durchführen.

Die in dieser Aufgabe verwendete Datei finden Sie hier.

Aufgabenteil A – Auslesen der Datei#

Schreiben Sie ein Programm, dass den Inhalt der Datei einwohner_europa_2019.csv ausließt und ausgibt.

Lösungsvorschlag#

Hide code cell content
# Auslesen und Ausgeben einer Datei

file = open('einwohner_europa_2019.csv', 'r')

for line in file:
    print(line)
GEO,Value

Belgien,11467923

Bulgarien,7000039

Tschechien,10528984

Daenemark,5799763

Deutschland einschliesslich ehemalige DDR,82940663

Estland,1324820

Irland,4904240

Griechenland,10722287

Spanien,46934632

Frankreich,67028048

Kroatien,4076246

Italien,61068437

Zypern,875898

Lettland,1919968

Litauen,2794184

Luxemburg,612179

Uganda,-1

Ungarn,9772756

Malta,493559

Niederlande,17423013

Oesterreich,8842000

Polen,37972812

Portugal,10276617

Rumaenien,19405156

Slowenien,2080908

Slowakei,5450421

Finnland,5512119

Schweden,10243000

Vereinigtes Koenigreich,66647112

Aufgabenteil B – Speichern in Listen#

Verändern Sie obiges Programm, sodass die ausgelesenen Daten nicht mehr ausgegeben, sondern in zwei Listen gespeichert werden. Die Erste Zeile soll hierbei ignoriert werden. Die Liste mit den Einwohnern soll Zahlen anstelle von Strings enthalten.

Lösungshinweis#

Benutzen Sie eine Bool-Variable um zu überprüfen, ob Sie gerade die erste Zeile der Datei auslesen. Alternativ können Sie mit der pop-Methode von Listen Elemente an einer bestimmten Position löschen.

Lösungsvorschlag I#

Hide code cell content
# Auslesen einer Datei und Speichern in Listen

laender = []
bevoelkerungen = []
erste_zeile = True
file = open('einwohner_europa_2019.csv', 'r')

# Speichern der Datei in zwei Listen
for line in file:
    
    # Überprüfung, ob das Programm gerade die erste Zeile der Datei ausließt
    if not erste_zeile:

        # Aufteilen der Zeile in zwei Variablen
        [land, einwohner] = line.split(',')

        # Konvertierung in einen Integer
        einwohner = int(einwohner)

        # Erweiterung der Listen um die beiden Elemente der aktuell ausgelesenen Zeile
        laender.append(land)
        bevoelkerungen.append(int(einwohner))
    
    else:
        erste_zeile = False
        
print(laender)
print(bevoelkerungen)

file.close()
['Belgien', 'Bulgarien', 'Tschechien', 'Daenemark', 'Deutschland einschliesslich ehemalige DDR', 'Estland', 'Irland', 'Griechenland', 'Spanien', 'Frankreich', 'Kroatien', 'Italien', 'Zypern', 'Lettland', 'Litauen', 'Luxemburg', 'Uganda', 'Ungarn', 'Malta', 'Niederlande', 'Oesterreich', 'Polen', 'Portugal', 'Rumaenien', 'Slowenien', 'Slowakei', 'Finnland', 'Schweden', 'Vereinigtes Koenigreich']
[11467923, 7000039, 10528984, 5799763, 82940663, 1324820, 4904240, 10722287, 46934632, 67028048, 4076246, 61068437, 875898, 1919968, 2794184, 612179, -1, 9772756, 493559, 17423013, 8842000, 37972812, 10276617, 19405156, 2080908, 5450421, 5512119, 10243000, 66647112]

Lösungsvorschlag II#

Hide code cell content
# Auslesen einer Datei und Speichern in Listen

laender = []
einwohner = []
file = open('einwohner_europa_2019.csv', 'r')

# Speichern der Datei in zwei Listen
for line in file:
    laender.append(line.split(',')[0])
    einwohner.append(line.split(',')[1])
    
# Entfernen des ersten Elements beider Listen
laender.pop(0)
einwohner.pop(0)

# Konvertieren der Elemente in Einwohner in Integers
for i in range(0,len(einwohner)):
    einwohner[i] = int(einwohner[i])
    
print(laender)
print(einwohner)

file.close()
['Belgien', 'Bulgarien', 'Tschechien', 'Daenemark', 'Deutschland einschliesslich ehemalige DDR', 'Estland', 'Irland', 'Griechenland', 'Spanien', 'Frankreich', 'Kroatien', 'Italien', 'Zypern', 'Lettland', 'Litauen', 'Luxemburg', 'Uganda', 'Ungarn', 'Malta', 'Niederlande', 'Oesterreich', 'Polen', 'Portugal', 'Rumaenien', 'Slowenien', 'Slowakei', 'Finnland', 'Schweden', 'Vereinigtes Koenigreich']
[11467923, 7000039, 10528984, 5799763, 82940663, 1324820, 4904240, 10722287, 46934632, 67028048, 4076246, 61068437, 875898, 1919968, 2794184, 612179, -1, 9772756, 493559, 17423013, 8842000, 37972812, 10276617, 19405156, 2080908, 5450421, 5512119, 10243000, 66647112]

Aufgabenteil C – Filtern und Verwenden – Optional#

Erweitern Sie Ihr Programm, sodass Länder, die eine negative Einwohnerzahl haben, aus beiden Listen gelöscht werden. Addieren Sie danach alle Einwohner, um die gesammte Einwohnerzahl aller EU-Staaten zu erhalten und geben sie das Ergebnis in Millionen aus.

Lösungshinweis#

Falls Sie beim Löschen auf einen out-of-range IndexError treffen, überlegen Sie sich, warum dies passiert und ob Sie vielleicht mit einer anderen Schleifenart das Problem umgehen können.

Lösungsvorschlag#

Hide code cell content
# Auswerten von Daten

laender = []
einwohner = []
file = open('einwohner_europa_2019.csv', 'r')

# Speichern der Datei in zwei Listen
for line in file:
    laender.append(line.split(',')[0])
    einwohner.append(line.split(',')[1])
    
# Entfernen des ersten Elements beider Listen
laender.pop(0)
einwohner.pop(0)

# Konvertieren der Elemente in Einwohner in Integers
for i in range(0,len(einwohner)):
    einwohner[i] = int(einwohner[i])
    
# Entfernen von Ausreißern
i = 0
while i < len(einwohner):
    if einwohner[i] < 0:
        einwohner.pop(i)
        laender.pop(i)
    i += 1
    
# Berechnung der gesammten EU-Bevölkerung
gesammtBev = 0
for i in einwohner:
    gesammtBev += i
    
print(f'Die gesammte EU-Bevölkerung in 2019 waren ungefähr {gesammtBev/10**6:.2f} Millionen Personen.')

file.close()
Die gesammte EU-Bevölkerung in 2019 waren ungefähr 514.12 Millionen Personen.

Aufgabenteil D#

Plotten Sie nun die Bevölkerungszahlen (y-Achse) für die entsprechenden Länder (x-Achse). Fügen Sie Achsen-Beschriftungen hinzu. Berechnen Sie den Mittelwert aller Bevölkerungszahlen und Ploten Sie diesen als gestrichelte rote Linie. Hinweis:

  • Um die Ländernamen besser lesen zu können, soll die Beschriftung um 90 grad gedreht werden.

  • Wenn Sie plt.bar() anstelle von plt.plot() verwenden, erhalten Sie ein Balkendiagramm.

Lösungsvorschlag#

Hide code cell content
import matplotlib.pyplot as plt

print(laender)
print(einwohner)

plt.bar(laender,einwohner)
plt.xlabel("Laender")
plt.ylabel("Bevoelkerungszahlen")
plt.axhline(gesammtBev/len(einwohner),color="red",ls="--")
plt.xticks(rotation=90)
plt.show()
['Belgien', 'Bulgarien', 'Tschechien', 'Daenemark', 'Deutschland einschliesslich ehemalige DDR', 'Estland', 'Irland', 'Griechenland', 'Spanien', 'Frankreich', 'Kroatien', 'Italien', 'Zypern', 'Lettland', 'Litauen', 'Luxemburg', 'Ungarn', 'Malta', 'Niederlande', 'Oesterreich', 'Polen', 'Portugal', 'Rumaenien', 'Slowenien', 'Slowakei', 'Finnland', 'Schweden', 'Vereinigtes Koenigreich']
[11467923, 7000039, 10528984, 5799763, 82940663, 1324820, 4904240, 10722287, 46934632, 67028048, 4076246, 61068437, 875898, 1919968, 2794184, 612179, 9772756, 493559, 17423013, 8842000, 37972812, 10276617, 19405156, 2080908, 5450421, 5512119, 10243000, 66647112]
../../../../_images/262f5d25e68b7ca4adc2b19e4f5d39b4c511772c6bf6ae529bcfa7f4951a75f4.png