Testklausur 2025-01-15 Besprechung#

WICHTIG: Dieses Jupyter Notebook ist in der Klausur python-101 lediglich ein erlaubtes Hilfsmittel unter vielen anderen Hilfsmitteln, ähnlich einem Taschenrechner.

Übertragen Sie alle Ergebnisse aus dem Notebook auf Papier. Es wird ausschließlich die Papier-Version der Klausur bewertet.

Dauer der Klausur:

  • 60 Minuten

  • plus 10 Minuten Karenzzeit zum Übertragen der Ergebnisse auf Papier.

Aufgabe 1: zum Eingrooven#

gegeben:

  • eine Liste l von Zahlen: l = [ 3, 2, 1, 2, 3 ]

gesucht:

  • eine Liste l2 der Quadrate der Zahlen aus l

  • die Summe s2 aus l2

# Kontext
l = [ 3, 2, 1, 2, 3 ]
l2 = []
s2 = 0

# Ihr Programm
l2 = [ x*x for x in l ]#...
s2 = sum(l2)#...

# Ihr Ergebnis
l2, s2
([9, 4, 1, 4, 9], 27)
# Test
l2 == [9, 4, 1, 4, 9],  s2 == 27
(True, True)

Aufgabe 2: zu Dict einen reverted Index bilden#

gegeben:

  • ein Dict d, das für die Tage einer Woche die Maximaltemperatur zeigt:

    d = { "Mo": 17, "Di": 18, "Mi": 16, "Do": 15, "Fr": 16, "Sa": 17, "So": 17 }

gesucht:

  • ein Dict d2, das für jede Maximaltemperatur eine Liste von Tagen hat, die diese Temperatur hatten. (Man benötigt so etwas regelmäßig für Such-Anwendungen).

# Kontext
d = { "Mo": 17, "Di": 18, "Mi": 16, "Do": 15, "Fr": 16, "Sa": 17, "So": 17 }

# Ihre Lösung
d2 = {}

# Lösung 1 aus der Vl, "Grundstruktur Listenbearbeitung"
for tag, temperatur in d.items():
    if not temperatur in d2: # d2.keys()
        d2[temperatur] = []
    d2[temperatur].append(tag)
    
# andere Lösung: vorher schon initialisieren
d2 = {temperatur: [] for temperatur in set(d.values()) }
# jetzt gibt es schon alle keys, mit leeren Listen initialisiert
for tag, temperatur in d.items():
    d2[temperatur].append(tag)

# ganz böse, schlechte Comprehension
# wegen Nebeneffekt!
# wegwerfen = [ d2[temperatur].append(tag) for tag, temperatur in d.items()  ]

# Ihr Ergebnis
d2
{16: ['Mi', 'Fr'], 17: ['Mo', 'Sa', 'So'], 18: ['Di'], 15: ['Do']}
# Test
d2 == {17: ['Mo', 'Sa', 'So'], 18: ['Di'], 16: ['Mi', 'Fr'], 15: ['Do']}
True

Aufgabe 3: zip() simuieren#

gegeben:

  • zwei gleich lange Listen Wörter und Ziffern; in Liste Wörter kommt kein Wert doppelt vor.

gesucht:

  • ein Dict wort_zip, das zu jedem Wort die zugehörige Zahl angibt

Gesucht sind zwei verschiedene Lösungen, mit und ohne zip()

# Lösung 1, mit zip()
# Kontext
Wörter = [ "eins", "oans", "zwei", "zwoa", "adin" ]
Zahl = [1, 1, 2, 2, 1 ] 
wort_zahl = {}

# Ihre Lösung
wort_zahl = dict( zip(Wörter, Zahl) )
#wort_zahl = list( zip(Wörter, Zahl) )
#wort_zahl = tuple( zip(Wörter, Zahl) )

# Ihr Ergebnis
wort_zahl
{'eins': 1, 'oans': 1, 'zwei': 2, 'zwoa': 2, 'adin': 1}
# Test
wort_zahl == {'eins': 1, 'oans': 1, 'zwei': 2, 'zwoa': 2, 'adin': 1}
True
# Lösung 2, ohne zip()
# Kontext wie oben
Wörter = [ "eins", "oans", "zwei", "zwoa", "adin" ]
Zahl = [1, 1, 2, 2, 1 ] 
wort_zahl = {}

# Ihre Lösung
# indirektes Durchgehen mit Index
for i in range( len(Wörter) ):
    wort_zahl[ Wörter[i] ] = Zahl[i]

# Ihr Ergebnis
wort_zahl
{'eins': 1, 'oans': 1, 'zwei': 2, 'zwoa': 2, 'adin': 1}
# Test
wort_zahl == {'eins': 1, 'oans': 1, 'zwei': 2, 'zwoa': 2, 'adin': 1}
True

Aufgabe 4: Eine CSV-Datei einlesen, durchkneten, wieder ‘rausschreiben#

Gegeben ist ein Auszug aus einem Prüfungsplan als CSV-Datei:

Die Spalten Kürzel, Aufsicht und Zweitprüfer enthalten ein oder mehrere Kürzel für Personen. Wir lesen die Datei mit Pandas in das DataFrame df ein und exportieren es in die Darstellungen df_columns (spalten als Listen, hier default) oder bei Bedarf auch in df_rows (Zeilen als Dicts). Am Ende der Aufgabe erzeugen wir aus dem Dict von Dicts wieder ein DataFrame df2, das wir wieder als CSV-Datei pplan_mini_2.csv zurückschreiben.

gesucht:

  • Wer macht nur Aufsicht, ohne Erst- oder Zweitprüfer zu sein?

  • Wer prüft nur, macht aber keine Aufsicht?

auch interessant:

  • Fügen Sie eine Spalte “TN” (Anzahl Teilnehmer) hinzu. Als Wert verwenden Sie vorläufig eine gewürfelte Zahl zwischen 20 und 60.

  • erzeugen Sie ein Dict, das für jedes Kürzel alle IDs angibt, in denen die Person etwas tun muss.

(Und ach ja, das ist immer ein Problem: Groß- und Kleinschreibug. Wir benötigen eine Normalisierung.)

Lösen Sie die Aufgabe in beiden Versionen df_rows und df_columns.

# text datei einlesen
# irgendwo anders
# Kontext
import pandas as pd
df = pd.read_csv("pplan_mini.csv", sep=";", index_col="ID")
anzahl_zeilen, anzahl_spalten = df.shape
print(f"""Anzahl Spalten {anzahl_spalten}: {list(df.columns)}\nAnzahl Zeilen: {anzahl_zeilen}""")
df
Anzahl Spalten 5: ['Fach', 'Prüfer', 'Name', 'Aufsicht', 'Zweitprüfer']
Anzahl Zeilen: 4
Fach Prüfer Name Aufsicht Zweitprüfer
ID
1001 Programmieren I (1. Gruppe) BUJ Busse, Prof. Dr. BUJ,SLS OSN
1002 Programmieren I (2.Gruppe) buj Busse, Prof. Dr. BUJ , SLS OSN
1003 Programmieren I OSN Oserbergen, Prof. Dr. OSN, buj WAR
1004 Seminar BUJ Prof. Busse WAR OSN
# Kontext spaltenweise
df_columns =  df.to_dict(orient="list")  # spaltenweise Darstellung, hier Default
df_columns
{'Fach': ['Programmieren I (1. Gruppe)',
  'Programmieren I (2.Gruppe)',
  'Programmieren I ',
  'Seminar'],
 'Prüfer': ['BUJ', 'buj', 'OSN', 'BUJ'],
 'Name': ['Busse, Prof. Dr. ',
  'Busse, Prof. Dr. ',
  'Oserbergen, Prof. Dr.',
  'Prof. Busse'],
 'Aufsicht': ['BUJ,SLS', 'BUJ , SLS', 'OSN,  buj   ', 'WAR '],
 'Zweitprüfer': ['OSN', 'OSN', 'WAR ', 'OSN']}
# ggf. auch nützlich: Kontext zeilenweise
df_rows = df.to_dict(orient="index")     # zeilenweise Darstellung  (Alternative)
df_rows
{1001: {'Fach': 'Programmieren I (1. Gruppe)',
  'Prüfer': 'BUJ',
  'Name': 'Busse, Prof. Dr. ',
  'Aufsicht': 'BUJ,SLS',
  'Zweitprüfer': 'OSN'},
 1002: {'Fach': 'Programmieren I (2.Gruppe)',
  'Prüfer': 'buj',
  'Name': 'Busse, Prof. Dr. ',
  'Aufsicht': 'BUJ , SLS',
  'Zweitprüfer': 'OSN'},
 1003: {'Fach': 'Programmieren I ',
  'Prüfer': 'OSN',
  'Name': 'Oserbergen, Prof. Dr.',
  'Aufsicht': 'OSN,  buj   ',
  'Zweitprüfer': 'WAR '},
 1004: {'Fach': 'Seminar',
  'Prüfer': 'BUJ',
  'Name': 'Prof. Busse',
  'Aufsicht': 'WAR ',
  'Zweitprüfer': 'OSN'}}
alle_Pruefer = set()
alle_Aufsichten = set()
alle_Pruefer, alle_Aufsichten
(set(), set())
# Ihre Lösung

# Normalisierung: in der Spalte "Prüfer" alle Kürzel in Großbuchstaben ändern, 
# neue Spalte Prüfer_2 anlegen
df_columns["Prüfer_2"] = [ v.upper() for v in df_columns["Prüfer"] ] #...

# auführlich wäre das so:
# Grundstruktur
df_columns["Prüfer_2"] = []
for v in df_columns["Prüfer"]:
    df_columns["Prüfer_2"].append( v.upper() )


# alle Aufsichten
alle_Aufsichten = { k.strip() for feld in df_columns["Aufsicht"] for k in feld.split(",") } #...

# elegantere Lösung
def alle_aus_spalte(spalte):
    return  { k.strip().upper() for feld in df_columns[spalte] for k in feld.split(",") } #...

spalten_mit_kuerzeln = ["Prüfer", "Aufsicht", "Zweitprüfer"]
alle = {}
alle = { spalte: alle_aus_spalte(spalte) for spalte in spalten_mit_kuerzeln } #... alle = { spalte: alle_aus_spalte(spalte) for ... }

# Ihre Ergebnisse

alle
{'Prüfer': {'BUJ', 'OSN'},
 'Aufsicht': {'BUJ', 'OSN', 'SLS', 'WAR'},
 'Zweitprüfer': {'OSN', 'WAR'}}
# Test
alle == {'Prüfer': {'BUJ', 'OSN'},
 'Aufsicht': {'BUJ', 'OSN', 'SLS', 'WAR'},
 'Zweitprüfer': {'OSN', 'WAR'}}
True
# df_columns
# Ergebnis: Dict von Dicts wieder in ein DataFrame zurückverwandeln, dann display()

# falls Sie mit der spaltenweise Darstellung gearbeitet haben:
df2 = pd.DataFrame.from_dict(data=df_columns, orient="columns")

# falls Sie mit der zeilenweisen Darstellung gearbeitet hätten:
#df2 = pd.DataFrame.from_dict(data=df_rows, orient="index")

display(df2)
Fach Prüfer Name Aufsicht Zweitprüfer Prüfer_2
0 Programmieren I (1. Gruppe) BUJ Busse, Prof. Dr. BUJ,SLS OSN BUJ
1 Programmieren I (2.Gruppe) buj Busse, Prof. Dr. BUJ , SLS OSN BUJ
2 Programmieren I OSN Oserbergen, Prof. Dr. OSN, buj WAR OSN
3 Seminar BUJ Prof. Busse WAR OSN BUJ

Tabelle wieder als CSV-Datei exportieren:

df2.to_csv("pplan_mini_2.csv", sep=";")

# Bug: es gibt immer noch einen "buj" in Kleinbuchstaben! Aber so ist das immer ...

Persönliche Angaben:

Familienname:

Vorname:

Matrikelnummer:

Studiengang:

freiwillige Angaben, nicht bewertungsrelevant:

Drittversuch?

Punkte auf Codewars?