Python 101 Übungsblatt 4
Contents
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
unddays_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 Listengehe 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.
z.B. obige Lösung Dicts zusammenführen
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']}