Woche 03#

Vorbemerkung: Mehrfach-Zuweisung

a = 1
b = 2
a, b
(1, 2)
(a, b) = (1, 2)
a, b
(1, 2)
a, b = 1, 2
a,b
(1, 2)
a, b  = (1, 2)
a, b
(1, 2)
a, b = b, a
a, b
(2, 1)
a, b, c  = [ 1, [ "Hallo", "Welt!" ] , 3 ]
a, b, c 
(1, ['Hallo', 'Welt!'], 3)

Durchgehen durch eine Liste#

Werte an sich sind interessant:

werte = [ 1, 2, 5, 3, 2, 1, 1, 1 ]
# werte = []

summe = 0
anzahl = 0

for w in werte:
    print (w, end=" | ")
    summe = summe + w
    anzahl = anzahl + 1

schnitt = summe / anzahl

print("Anzahl:", anzahl, "Schnitt:",  schnitt)
1 | 2 | 5 | 3 | 2 | 1 | 1 | 1 | Anzahl: 8 Schnitt: 2.0

Werte als Schlüssel, um z.B. in einem Dict einen Wert zu identifizieren:

Zwei Schleifen, die das selbe tun:

werte2 = "Das ist das Haus von Nikolaus".split(" ")
werte2
['Das', 'ist', 'das', 'Haus', 'von', 'Nikolaus']
# Durch die Werte selber durchgehen
for w in werte2:
    print(w, end=" | ") 

print() # neue Zeile

# Auf die Werte über einen Schlüssel (hier i) zugreifen
for i in range(0, len(werte2)):
    print(werte2[i], end=" | ")
Das | ist | das | Haus | von | Nikolaus | 
Das | ist | das | Haus | von | Nikolaus | 

Anwendung: zu einer Schulnote den Prosa-Text heraussuchen

Noten = { 1: "sgt", 2: "gut", 3: "bfr", 4: "ausr", 5: "mgh", 6: "ung" }
werte = [ 1, 2, 5, 3, 2, 1, 1, 1 ]

for w in werte:
    print( Noten[w], end = " | " )
sgt | gut | mgh | bfr | gut | sgt | sgt | sgt | 

Häufigkeit zählen#

Wie oft ist ein bestimmter Wert vorhanden?

Wir erzeugen als Ergebnis ein Dict

Möglichkeit 1: Das Dict vorab initialisieren.

werte = [ 1, 2, 5, 3, 2, 1, 1, 1 ]
count = {} # kein Set, sondern ein Dict

# Dict-Werte mit `0` initialisieren
for i in [1, 2, 3, 4, 5]:
    count[i] = 0

# Dict durchgehen und zählen
for w in werte:
    count[w] = count[w] + 1
    #print("INFO 7:", w, count)

# Das Ergebnis ist ein Dict
print(count)
{1: 4, 2: 2, 3: 1, 4: 0, 5: 1}

Möglicher Nachteil von Möglichkeit 1: Wir legen keys an und initialisieren sie, die gar nicht nötig sind.

Möglichkeit 2: Key anlegen und initialieren erst dann, wenn er benötogt wird.

werte = [ 1, 2, 5, 3, 2, 1, 1, 1 ]
count = {} # kein Set, sondern ein Dict

# Dict durchgehen und zählen
for w in werte:
    if w not in count: # gibt es den Key ggf. noch gar nicht?
        count[w] = 0 # initialisieren
    count[w] = count[w] + 1
    #print("INFO 7:", w, count)

# Das Ergebnis ist ein Dict
print(count)
{1: 4, 2: 2, 5: 1, 3: 1}

Bsp#

text = """https://de.wikipedia.org/wiki/Huffman-Kodierung#Geschichte: 
Im Jahre 1951 hatten David A. Huffman und seine Klassenkameraden am MIT im Kurs Informationstheorie 
die Wahl zwischen einer Seminararbeit und einer Abschlussprüfung. Die Seminararbeit, betreut von 
Professor Robert M. Fano, sollte die Findung des effizientesten binären Codes thematisieren. 
Huffman, der nicht in der Lage war, die Effizienz eines Codes zu beweisen, war nur knapp vor dem 
Entschluss, aufzugeben und sich für die Abschlussprüfung vorzubereiten, als er auf die Idee stieß, 
einen frequenzsortierten Binärbaum zu verwenden, und somit in kürzester Zeit jene Methode als 
effizienteste beweisen konnte.\nAuf diese Weise übertraf Huffman seinen Professor Fano, 
der gemeinsam mit dem Begründer der Informationstheorie Claude Shannon einen ähnlichen Code entwickelte. 
Indem Huffman den Baum von unten nach oben anstatt von oben nach unten erstellte, 
vermied er die größte Schwachstelle der suboptimalen Shannon-Fano-Kodierung.[4]""".lower()
text
'https://de.wikipedia.org/wiki/huffman-kodierung#geschichte: \nim jahre 1951 hatten david a. huffman und seine klassenkameraden am mit im kurs informationstheorie \ndie wahl zwischen einer seminararbeit und einer abschlussprüfung. die seminararbeit, betreut von \nprofessor robert m. fano, sollte die findung des effizientesten binären codes thematisieren. \nhuffman, der nicht in der lage war, die effizienz eines codes zu beweisen, war nur knapp vor dem \nentschluss, aufzugeben und sich für die abschlussprüfung vorzubereiten, als er auf die idee stieß, \neinen frequenzsortierten binärbaum zu verwenden, und somit in kürzester zeit jene methode als \neffizienteste beweisen konnte.\nauf diese weise übertraf huffman seinen professor fano, \nder gemeinsam mit dem begründer der informationstheorie claude shannon einen ähnlichen code entwickelte. \nindem huffman den baum von unten nach oben anstatt von oben nach unten erstellte, \nvermied er die größte schwachstelle der suboptimalen shannon-fano-kodierung.[4]'
text = "".join([ buchstabe for buchstabe in text if buchstabe == " " or buchstabe.isalpha() ])
text
'httpsdewikipediaorgwikihuffmankodierunggeschichte im jahre  hatten david a huffman und seine klassenkameraden am mit im kurs informationstheorie die wahl zwischen einer seminararbeit und einer abschlussprüfung die seminararbeit betreut von professor robert m fano sollte die findung des effizientesten binären codes thematisieren huffman der nicht in der lage war die effizienz eines codes zu beweisen war nur knapp vor dem entschluss aufzugeben und sich für die abschlussprüfung vorzubereiten als er auf die idee stieß einen frequenzsortierten binärbaum zu verwenden und somit in kürzester zeit jene methode als effizienteste beweisen konnteauf diese weise übertraf huffman seinen professor fano der gemeinsam mit dem begründer der informationstheorie claude shannon einen ähnlichen code entwickelte indem huffman den baum von unten nach oben anstatt von oben nach unten erstellte vermied er die größte schwachstelle der suboptimalen shannonfanokodierung'
alle_buchstaben = set(text)
print(sorted(alle_buchstaben), len(alle_buchstaben))
[' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'z', 'ß', 'ä', 'ö', 'ü'] 29
# display(sorted(alle_buchstaben), len(alle_buchstaben))
count = {} # ein Dicht, kein Set
for buchstabe in text:
    if buchstabe not in count.keys():
        count[buchstabe] = 0 # key: value anlegen, value mit 0 initialisieren
    count[buchstabe] += 1
print(count)
{'h': 29, 't': 47, 'p': 9, 's': 52, 'd': 39, 'e': 134, 'w': 12, 'i': 69, 'k': 11, 'a': 49, 'o': 35, 'r': 55, 'g': 12, 'u': 34, 'f': 32, 'm': 28, 'n': 89, 'c': 18, ' ': 129, 'j': 2, 'v': 8, 'l': 18, 'z': 12, 'b': 19, 'ü': 6, 'ä': 3, 'ß': 2, 'q': 1, 'ö': 1}

Dict durchgehen: keys(), values(), items()#

# für Demo-Zwecke Kurzversion von obigem dict, ggf. später auskommentieren
count = {'h': 29, 't': 47, 'p': 9, 's': 52 }

Durch das Dict count durchgehen:

for k in count:
    print( k, end=" | ")
h | t | p | s | 
for k in count.keys():
    print( k, end=" | ")
h | t | p | s | 
for k in count.values():
    print( k, end=" | ")
29 | 47 | 9 | 52 | 
for kv in count.items():
    print( kv, end=" | ")
('h', 29) | ('t', 47) | ('p', 9) | ('s', 52) | 
for kv in count.items():
    print( kv, kv[0], kv[1], end=" | ")
('h', 29) h 29 | ('t', 47) t 47 | ('p', 9) p 9 | ('s', 52) s 52 | 
for kv in count.items():
    print( kv[0], ":", kv[1], end=" | ")
h : 29 | t : 47 | p : 9 | s : 52 | 
for k, v in count.items():
    print( k, ":", v, end=" | ")
h : 29 | t : 47 | p : 9 | s : 52 | 

Bsp#

Ein beliebiges Element mit minimaler Häufigkeit identifizieren:

# für Demo-Zwecke Kurzversion von obigem dict, ggf. später auskommentieren
count = {'h': 29, 't': 47, 'p': 9, 's': 52 }
min_k = None
min_v = 99999 # len(text)+1 # größer als wenn es nur ein einziges Zeichen im String geben würde

for k, v in count.items():
    if v < min_v:
        print("neues Minimum gefunden:", v)
        min_v = v
        min_k = k
    else:
        print("nichts zu tun:", v)

min_k, min_v
neues Minimum gefunden: 29
nichts zu tun: 47
neues Minimum gefunden: 9
nichts zu tun: 52
('p', 9)

Einführung: List Comprehension#

ergebnis = []

for x in range(0,6):
    print( x )
    ergebnis.append( x*x )

ergebnis
0
1
2
3
4
5
[0, 1, 4, 9, 16, 25]
ergebnis = [  x*x  for x in range(0,6)    ]
ergebnis
[0, 1, 4, 9, 16, 25]
ergebnis = [  x*x  for x in range(0,6)    ]
ergebnis
[0, 1, 4, 9, 16, 25]
ergebnis = []

for x in range(0,6):
    ergebnis.append( x*x ) 
ergebnis
[0, 1, 4, 9, 16, 25]
ergebnis = []

for x in range(0,6):
    if x %2 == 0:
        print( x, "ist gerade" )
        ergebnis.append( x*x )

ergebnis
0 ist gerade
2 ist gerade
4 ist gerade
[0, 4, 16]
# liste
ergebnis = [ x*x    for x in range(0,6)      if x %2 == 0 ]
ergebnis
[0, 4, 16]
#set
ergebnis = { x*x    for x in range(0,6)      if x %2 == 0 }
ergebnis
{0, 4, 16}
#dict
ergebnis = { x: x*x    for x in range(0,6)      if x %2 == 0 }
ergebnis
{0: 0, 2: 4, 4: 16}