Python 101 Übungsblatt 4#

Dieses Übungsblatt enthält

  • einige “Brot- und Butter”-Aufgaben aus den Übungsblättern 2 und 3

  • ein paar wenige neue Aufgaben zum dezeitigen Stoff

  • NEU: Mengen … aber die sind einfach. Nachlesen: sets

Gegeben seien diese Dicts:

days_DE = {1: "Montag", 2: "Dienstag", 3: "Mittwoch", 
                    4: "Donnerstag", 5: "Freitag", 6: "Samstag", 7: "Sonntag"}

Buchstaben zählen#

Gegeben:

  • Ein Dict von Strings, z.B. days_DE (siehe oben).

gesucht:

  • Wie oft kommt in den deutschen days_DEn jeder Buchstabe vor?

    • Ergebnis z.B. zaehlung_bsp (siehe unten).

Lösungshinweis: Grundstruktur Listenbearbeitung

zaehlung = {}
for Tag in days_DE.values():
    for Buchstabe in Tag:
        ... # 
            ... # 
        ... # 
            ... # 
print(zaehlung)

zaehlung_bsp = {'m': 3, 'o': 4, 'n': 6, 't': 8, 'a': 7, 'g': 6, 'd': 2, 
                'i': 3, 'e': 3, 's': 5, 'w': 1, 'c': 1, 'h': 1, 'r': 2, 'f': 1}
  Cell In [2], line 5
    ... #
    ^
IndentationError: unexpected indent
assert zaehlung == zaehlung_bsp
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In [3], line 1
----> 1 assert zaehlung == zaehlung_bsp

NameError: name 'zaehlung' is not defined

einer der häufigsten Buchstaben#

Gegeben:

  • ein Dict, das zu jedem Buchstaben seine Häufigkeit angibt

    • z.B. obiges Dict zaehlung_bsp

Gesucht:

  • Welcher Buchstabe kommt am häufigsten vor?

Nebenbedingungen:

  • Wenn mehre Buchstaben am häufigsten vorkommen, kann ein beliebiger davon als Ergebnis gelten.

  • Suchen Sie nach einer Lösung, die ohne eine Sortierfunktion auskommt (denn Sortieren ist ggf. teuer).

char, maximum = None, 0
for k, v in zaehlung_bsp.items():
    ... # 
        ... # 
print(f"{char=}, {maximum=}")
# char='t', count=8
  Cell In [4], line 4
    ... #
    ^
IndentationError: unexpected indent

Alle häufigsten Buchstaben#

Gegeben:

  • ein Dict, das zu jedem Buchstaben seine Häufigkeit angibt

    • z.B. obiges Dict zaehlung_bsp

Gesucht:

  • ein Dict, das zu jeder Häufigkeit eine Liste der Buchstaben mit dieser Häufigkeit angibt

print(zaehlung_bsp)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In [5], line 1
----> 1 print(zaehlung_bsp)

NameError: name 'zaehlung_bsp' is not defined
haeufigkeit_bsp = {3: ['m', 'i', 'e'], 
                   4: ['o'], 
                   6: ['n', 'g'], 
                   8: ['t'], 
                   7: ['a'], 
                   2: ['d', 'r'], 
                   5: ['s'], 
                   1: ['w', 'c', 'h', 'f']}
haeufigkeit = {}
char, maximum = None, 0
for k, v in zaehlung_bsp.items():
    ... # 
        ... # 
    ... # 
  Cell In [7], line 5
    ... #
    ^
IndentationError: unexpected indent
assert haeufigkeit_bsp == haeufigkeit
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In [8], line 1
----> 1 assert haeufigkeit_bsp == haeufigkeit

NameError: name 'haeufigkeit' is not defined

Dicts zusammenführen#

Gegeben:

  • zwei Dicts mit ähnlichen Schlüsseln, aber unterschiedlichen Werten dazu

    • z.B. days_DE und days_EN, s.u.

Gesucht:

  • ein drittes dict, das zu jedem Key eine Liste der vorhandenen Values zeigt z.B. Vereinigung, s.u.

Strategie:

  • bilde aus den Keys beider Dicts ein Set

  • ezeuge aus dem Set ein neues Dict Vereinigung mit leeren Listen

  • gehe beide Dicts durch und ergänze das Dict Vereinigung

Überraschung: Diese Aufgabe ist schon gelöst! Bitte schauen Sie sich die Lösung an und versuchen Sie, diese zu verstehen.

days_DE = {1: "Montag", 
              2: "Dienstag", 3: "Mittwoch", 
              4: "Donnerstag", 5: "Freitag" }
days_EN =  {3: "Wednesday", 
              4: "Thursday", 5: "Friday", 
              6: "Saturday", 7: "Sunday"}
days_RU = { 1: "понедельник",
           2: "вторник" }
dictlist = [days_DE, days_EN, days_RU]

Schritt 1: Welche keys haben wir denn in beiden Dicts?

# Grundstruktur Listenbearbeitung aus der ersten Woche python-101
all_keys = set()
for d in dictlist:
    for k in d:
        all_keys |= { k }
all_keys
{1, 2, 3, 4, 5, 6, 7}
# etwas kompakter:
all_keys = set()
for d in dictlist:
    all_keys |= { k for k in d }
all_keys
{1, 2, 3, 4, 5, 6, 7}
# ganz kompakt
all_keys = { k for d in dictlist for k in d }
all_keys
{1, 2, 3, 4, 5, 6, 7}

Schritt 2: Die Vereinigungsmenge herstellen

# ausführlich: Grundstruktur Listenbearbeitung

# Dict "Vereinigung" initialisieren: Für jeden key eine leere Liste anlegen
Vereinigung = { k: [] for k in all_keys }

# anfüllen
for dct in dictlist:
    for k, v in dct.items():
        Vereinigung[k].append(v)
Vereinigung
{1: ['Montag', 'понедельник'],
 2: ['Dienstag', 'вторник'],
 3: ['Mittwoch', 'Wednesday'],
 4: ['Donnerstag', 'Thursday'],
 5: ['Freitag', 'Friday'],
 6: ['Saturday'],
 7: ['Sunday']}
# sehr kurz, unlesbar und maximal hässlich
# wieder mit leeren Listen initialisieren
Vereinigung = { k: [] for k in all_keys }

# dann der Trick: die folgende List comprehension liefert direkt nur None ...
[ Vereinigung[k].append(v) for dct in dictlist for k, v in dct.items() ]
[None, None, None, None, None, None, None, None, None, None, None, None]
# ... aber das Dict `Vereinigung` wurde durch das `append()` als "erwünschter Nebeneffekt" geändert:
Vereinigung
{1: ['Montag', 'понедельник'],
 2: ['Dienstag', 'вторник'],
 3: ['Mittwoch', 'Wednesday'],
 4: ['Donnerstag', 'Thursday'],
 5: ['Freitag', 'Friday'],
 6: ['Saturday'],
 7: ['Sunday']}

Funktion definieren#

Gegeben:

  • eine Lösung zu einem kleinen Problem in Form einiger Jupyter Notebook Zellen.

Gesucht:

  • diese Lösung in eine Funktion eingepackt.

    • z.B. vereinige_dicts(...), siehe unten

def vereinige_dicts(*dicts):
    """gibt die "Vereinigung" von 2 oder mehr Dicts zurück."""
    ... # 
    ... # 
    return Vereinigung
vereinige_DE_EN_RU = vereinige_dicts( days_DE, days_EN, days_RU)
assert vereinige_DE_EN_RU == {1: ['Montag', 'понедельник'],
 2: ['Dienstag', 'вторник'],
 3: ['Mittwoch', 'Wednesday'],
 4: ['Donnerstag', 'Thursday'],
 5: ['Freitag', 'Friday'],
 6: ['Saturday'],
 7: ['Sunday']}