Protokoll 2025-09-29#

l = [ 2, 3.1415 ,  "Hallo Johannes!", [ True, False]  ]
l
[2, 3.1415, 'Hallo Johannes!', [True, False]]
l
[2, 3.1415, 'Hallo Johannes!', [True, False]]
uz = [ 1, 3, 5, 7 ]
6 % 2
0
uz_quadrate = []
for x in range(0, 10):
    if x % 2 == 1:
        fnergebnis = x*x
        print(x, fnergebnis)
        uz_quadrate.append( fnergebnis )
    else:
        print(x, "gefäält mir nicht")
0 gefäält mir nicht
1 1
2 gefäält mir nicht
3 9
4 gefäält mir nicht
5 25
6 gefäält mir nicht
7 49
8 gefäält mir nicht
9 81
uz_quadrate = []
for x in range(0, 10):
    if x % 2 == 1:
        uz_quadrate.append( x*x )
uz_quadrate = []

for x in range(0, 10):
    if x % 2 == 1:
        uz_quadrate.append( x*x )
# kn ... Klausurnoten
kn = [ 1 , 1, 5, 4, 2, 2, 1 ]

kn_bestanden = [ n     for n in kn    if n <= 4 ]
kn_bestanden
[1, 1, 4, 2, 2, 1]
kn_bestanden
[1, 1, 4, 2, 2, 1]
kn_bestanden = []

ergebnis = [ n     for n in kn    if n <= 4 ]

ergebnis
[1, 1, 4, 2, 2, 1]
import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
l = [ 1, 2, 3]
l
[1, 2, 3]
l.append(99)
l
[1, 2, 3, 99]
# l.extend(99) wirft fehler
l.extend( [ 99,100, 101] )
l
[1, 2, 3, 99, 99, 100, 101]
l * 2
[1, 2, 3, 99, 99, 100, 101, 1, 2, 3, 99, 99, 100, 101]
"Hallo" * 2
'HalloHallo'
"Hallo" * "Welt"
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[19], line 1
----> 1 "Hallo" * "Welt"

TypeError: can't multiply sequence by non-int of type 'str'

Runde 1#

l1 = [1, 2,  3 ]

Runde 2#

#gegeben
m2 = [ [1,2,3], [4,5,6] ]
# gesucht:
m2_transponiert = [ [1,4], [2,5], [3,6] ]

gegeben: Eine Liste von Klausurnoten.

Gesucht: Notenschnitt

  • aller Noten

  • nur der bestandenen Noten

noten = [ 1, 2, 5, 5, 1, 2 ]
sum( noten )
16
len( noten )
6
schnitt_alles = sum( noten ) / len( noten )
schnitt_alles
2.6666666666666665
noten_bestanden = [ n      for n in noten     if n <= 4  ]
noten_bestanden
[1, 2, 1, 2]
schnitt_bestanden = sum( noten_bestanden ) / len( noten_bestanden )
schnitt_bestanden
1.5
# gegeben:
noten = [ 1, 2, 5, 5, 1, 2 ]

# gesucht:
# Die Summe aller Noten.
# Verwenden Sie nicht sum()

summe = 0
länge = 0
for x in noten:
    if x <= 4:
        summe = summe + x 
        länge = länge + 1

( summe, länge, summe / länge )
(6, 4, 1.5)
h = "Hallo"
w = "Welt"
hw = h + " " + w
abc = "abcdefghijklmnopqrstuvwxyz"

abc[2]
'c'
# l = [ 'a', 'b', 'c', 'd' ]
l = "abcd"
l
'abcd'
for i in [ 2, 3, 5 , 9]:
    print(i, abc[i])
2 c
3 d
5 f
9 j
for x in "abcd":
    print(x)
a
b
c
d
for i in [ 0, 1, 2, 3]:
    print( abc[i] )
a
b
c
d
for i in range(0, 4 ):
    print( abc[i] )
a
b
c
d
# gegeben:
zahlen =     [ 1,      2,      3,       4 ]
aussprache = [ "oans", "zwoa", "gsuffa" ]
len(zahlen) == len(aussprache)
False
# gesucht:
[ [1, "oans"], [2, "zwoa"], ... ]
[[1, 'oans'], [2, 'zwoa'], Ellipsis]
ergebnis = []

for i in range( min( len(zahlen), len(aussprache) ) ):
    print(i, zahlen[i] , aussprache[i] )
    ergebnis.append(  [ zahlen[i] , aussprache[i] ]     )
ergebnis
0 1 oans
1 2 zwoa
2 3 gsuffa
[[1, 'oans'], [2, 'zwoa'], [3, 'gsuffa']]
list( zip( zahlen, aussprache) )
[(1, 'oans'), (2, 'zwoa'), (3, 'gsuffa')]
aussprache_by = dict( zip( zahlen, aussprache) )
aussprache_by
{1: 'oans', 2: 'zwoa', 3: 'gsuffa'}
aussprache_by[1]
'oans'
aussprache_by.get(99, "ja mei")
'ja mei'
for x in aussprache_by:
    print( x )
1
2
3
for x in aussprache_by.keys():
    print( x )
1
2
3
for x in aussprache_by.values():
    print( x )
oans
zwoa
gsuffa
for x in aussprache_by.items():
    k = x[0]
    v = x[1]
    print( x, k, v )
    
(1, 'oans') 1 oans
(2, 'zwoa') 2 zwoa
(3, 'gsuffa') 3 gsuffa
for (k, v)  in aussprache_by.items():
    print( k, v )
1 oans
2 zwoa
3 gsuffa
( a , b, c )  = ( 1, 2, 3 )
c
3
def schnitt( notenliste, kippnote = 4):
    bestandene_klausuren = [ n     for n in notenliste   if n <= kippnote ] 
    #print("Info 1415", bestandene_klausuren)
    return sum(bestandene_klausuren) / len(bestandene_klausuren)
# fancy
meine_noten = { "kippnote": 5, "notenliste" :[1 ,2, 5] }
schnitt( **meine_noten )
2.6666666666666665
schnitt( kippnote = 5 , notenliste=[1 ,2, 5] )
2.6666666666666665
def doppelt(x):
    if isinstance(x, int):
        return 2 * x
    else:
        print( f"""INFO 1507: falscher Typ: {type(x)=}""")
doppelt( [1,2,3] )
INFO 1507: falscher Typ: type(x)=<class 'list'>
def kürzer( l ):
    return l.pop()
    
def doppeltliste( l ):
    return 2*l
l = [0, 1, 2, 3, 4, 3, 2, 1 ]
doppeltliste( l )
[0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1]
l
[0, 1, 2, 3, 4, 3, 2, 1]
l = [0, 1, 2, 3, 4, 3, 2, 1 ]
kürzer( l )
1
l
[0, 1, 2, 3, 4, 3, 2]

inplace oder Kopie?#

mit append()

l = [ 1, 2, 3 ]
l2 = l
l.append( 99 )
l
[1, 2, 3, 99]
l2
[1, 2, 3, 99]
l is l2
True

mit +

l = [ 1, 2, 3 ]
l2 = l
l = l + [ 99 ]
l
[1, 2, 3, 99]
l2
[1, 2, 3]
l is l2
False

mit slicing

l = [ 1, 2, 3 ]
l2 = l[:]
l.append(99)
l
[1, 2, 3, 99]
l2
[1, 2, 3]
l is l2
False
x, y  = 6, 7
antw =  x * y
print(x , "mal", y, "ist", antw)
6 mal 7 ist 42
Ergebnismeldung = f"""{x} mal {y} ist {antw}"""
Ergebnismeldung
'6 mal 7 ist 42'
antw = f"{ sum( [x for x in range(1,6) ] )  }"
antw
'15'
sg = """Name, Alter, Schuhgroesse
Johannes, 60, 42
Mary, 30, 38"""
len( sg)
55
sg.split("\n")
['Name, Alter, Schuhgroesse', 'Johannes, 60, 42', 'Mary, 30, 38']
zeilen = sg.split("\n")
zeilen
['Name, Alter, Schuhgroesse', 'Johannes, 60, 42', 'Mary, 30, 38']
matrix = [ z.split() for z in zeilen ]
matrix
    
[['Name,', 'Alter,', 'Schuhgroesse'],
 ['Johannes,', '60,', '42'],
 ['Mary,', '30,', '38']]

Runde 2#

Hobbies#

hobbies = { "Adam": [ "Schwimmen", "Tanzen" ] ,
           "Berta": [ "Lesen", "Tanzen" ] }
hobbies
{'Adam': ['Schwimmen', 'Tanzen'], 'Berta': ['Lesen', 'Tanzen']}

Welche Hobbies hat Adam?

hobbies['Adam']
['Schwimmen', 'Tanzen']

Welche Hobbies haben die Menschen?

for x in hobbies:
    print(x, hobbies[x])
Adam ['Schwimmen', 'Tanzen']
Berta ['Lesen', 'Tanzen']
for x in hobbies.keys():
    print(  f"Peson {x} hat {hobbies[x]=} ")
Peson Adam hat hobbies[x]=['Schwimmen', 'Tanzen'] 
Peson Berta hat hobbies[x]=['Lesen', 'Tanzen'] 
for k, v in hobbies.items():
    print(  f"Peson {k=} hat Hobbies {v=} ")
Peson k='Adam' hat Hobbies v=['Schwimmen', 'Tanzen'] 
Peson k='Berta' hat Hobbies v=['Lesen', 'Tanzen'] 

Wer hat das Hobby “Tanzen”?

allgemein: Welches Hobby hat wer?

# da wollen wir hin:

hobbies_invers_manuell = { "Tanzen": [ "Adam", "Berta" ] , "Schwimmen": [ ... ], "Lesen": [ ... ] }
alle_hobbies = set()

for person, hobby_liste in hobbies.items():
    print(person, hobby_liste)
    for h in hobby_liste:
        print( f"  1025: {h}" )
        alle_hobbies.add(h)

alle_hobbies
Adam
 ['Schwimmen', 'Tanzen']
  1025: Schwimmen
  1025: Tanzen
Berta ['Lesen', 'Tanzen']
  1025: Lesen
  1025: Tanzen
{'Lesen', 'Schwimmen', 'Tanzen'}
hobbies_invers = { h: []  for h in alle_hobbies }
hobbies_invers
{'Lesen': [], 'Tanzen': [], 'Schwimmen': []}

Standardlösung

"""
hobbies_invers = {}  # ein leeres dict
"""
# Wir gehen alle Personen und ihre Hobbies durch
for ( person, hobby_liste ) in hobbies.items():
    
    print(  f"INFO 0950 {person=}, {hobby_liste=}" )

    # Wir gehen alle Hobbies der Person durch
    for h in hobby_liste:

        """
        #### nur nötig bei der Lösung ohne Mengen
        # haben wir das Hobby schon mal gesehen?

        # falls nicht: mit leerer Liste initialisieren,
        # d.h. Schlüssel anlegen, leere Liste als Wert
        if h not in hobbies_invers:
            print(  f"INFO 1000 lege neuen key {h=} an" )
            hobbies_invers[h] =  []
        else:
            print(  f"INFO 1001: kenne den key {h=} schon" )            
        # jetzt sind wir sicher, dass es den Schlüssel gibt!
        """
        
        hobbies_invers[h].append( person )

hobbies_invers
        
INFO 0950 person='Adam', hobby_liste=['Schwimmen', 'Tanzen']
INFO 0950 person='Berta', hobby_liste=['Lesen', 'Tanzen']
{'Lesen': ['Berta'], 'Tanzen': ['Adam', 'Berta'], 'Schwimmen': ['Adam']}
d = "2001-01-13"
[ int(x)  for x in  d.split("-") ]
[2001, 1, 13]

Geburtstage#

g = { "Peter": "2002-01-03", "Anne": "2000-01-27", "Mary": "2001-03-01" }

Wer hat im Januar Geburtstag, wem darf gratuliert werden?

# da wollen wir notfalls hin
g_fastgut = { "Peter": [ 2002, 1, 3 ],
         "Anne": ...
        }
g_fastgut = {}

for k, v in g.items():
    #print(k,v)

    jjjj_mm_tt_liste = v.split("-")
    #print(k, v, jjjj_mm_tt_liste)
    
    g_fastgut[k] = jjjj_mm_tt_liste

g_fastgut
{'Peter': ['2002', '01', '03'],
 'Anne': ['2000', '01', '27'],
 'Mary': ['2001', '03', '01']}
# da wollen wir hin
g_gut = { "Peter": { "jjjj": 2002, "mm": 1, "tt": 3 },
         "Anne": ...
        }
g_gut = {}

for k, v in g.items():
    #print(k,v)

    jjjj_mm_tt_liste =   [  int(x) for x in v.split("-") ]
    print(k, v, jjjj_mm_tt_liste)

    # das ist ok
    g_gut[k] = { "jjjj": jjjj_mm_tt_liste[0], "mm": jjjj_mm_tt_liste[1], "tt": jjjj_mm_tt_liste[2] }


g_gut
Peter 2002-01-03 [2002, 1, 3]
Anne 2000-01-27 [2000, 1, 27]
Mary 2001-03-01 [2001, 3, 1]
{'Peter': {'jjjj': 2002, 'mm': 1, 'tt': 3},
 'Anne': {'jjjj': 2000, 'mm': 1, 'tt': 27},
 'Mary': {'jjjj': 2001, 'mm': 3, 'tt': 1}}
g_cool = {}

for k, v in g.items():
    #print(k,v)

    jjjj_mm_tt_liste =   [  int(x) for x in v.split("-") ]
    print(k, v, jjjj_mm_tt_liste)

    schlüsselnamen = [ "jjjj", "mm", "tt" ]
    
    # das ist ok
    g_cool[k] = dict( zip( schlüsselnamen, jjjj_mm_tt_liste ))


g_cool
Peter 2002-01-03 [2002, 1, 3]
Anne 2000-01-27 [2000, 1, 27]
Mary 2001-03-01 [2001, 3, 1]
{'Peter': {'jjjj': 2002, 'mm': 1, 'tt': 3},
 'Anne': {'jjjj': 2000, 'mm': 1, 'tt': 27},
 'Mary': {'jjjj': 2001, 'mm': 3, 'tt': 1}}

Wer hat im Januar nun denn Geburtstag?

monat = 1

for k, v in g_gut.items():
    #print(k,v)
    if v['mm'] == monat:
        print( f"im Monat {monat=} hat {k} Geburtstag!")
im Monat monat=1 hat Peter Geburtstag!
im Monat monat=1 hat Anne Geburtstag!
import random as rd
for i in range(0,10):
    print(rd.randrange(1, 6))
5
4
4
3
5
5
5
2
2
3
print( [ rd.randrange(1, 6) + rd.randrange(1, 6)     for i in range(0,100) ] )
[4, 6, 2, 6, 5, 7, 8, 5, 7, 9, 2, 2, 8, 8, 5, 6, 8, 7, 6, 7, 6, 6, 5, 5, 4, 8, 5, 8, 7, 4, 7, 4, 7, 5, 8, 7, 4, 7, 8, 7, 7, 6, 8, 2, 7, 8, 5, 7, 2, 5, 8, 3, 5, 3, 6, 5, 5, 6, 4, 7, 5, 4, 4, 6, 7, 10, 5, 6, 6, 9, 7, 6, 7, 4, 7, 5, 8, 4, 7, 8, 4, 6, 7, 10, 7, 3, 3, 6, 2, 4, 8, 10, 8, 6, 7, 10, 7, 7, 6, 3]
w = [ 1,2,3,4,5,6]
rd.shuffle(w)
w
[1, 4, 2, 5, 3, 6]

Datei einlesen#

dateiname = "python-101-beispielchat.txt"
with open(dateiname) as beispielchat:
    text = beispielchat.read()

print( f"1314 INFO : {dateiname=} {len(text)=}")
1314 INFO : dateiname='python-101-beispielchat.txt' len(text)=1209
text_kopf, text_body = text.split("====================", 1)
Interaktionen = text_body.split("Benutzereingabe")[1:]
Interaktionen
[' 1 von 2 - 30.9.2025, 13:02:23:\nIch werde in 5 Jahren pensioniert und will noch Portraitzeichnen lernen. \n\nGPT-5 mini:\nSehr gut — 5 Jahre sind ein realistischer Zeitraum, um Portraitzeichnen sicher zu erlernen. Ich schlage einen strukturierten 5-Jahres-Plan mit konkreten Zielen, Lernressourcen, wöchentlichen Übungen und Meilensteinen vor.\n\nWelche dieser drei Optionen soll ich jetzt ausarbeiten?\n\n--------------------\n\n',
 ' 2 von 2 - 30.9.2025, 13:03:06:\nWomit soll ich anfangen?\n\nGPT-5 mini:\nBeginnen Sie mit einem einfachen, fokussierten Starterprogramm, das drei Dinge kombiniert: Grundlagenübungen, Kopfkonstruktion und tägliche kurze Praxis. Das braucht nur 30–60 Minuten pro Tag.\n\nKonkreter 8‑Wochen Starterplan\nWenn Sie möchten, erstelle ich jetzt:\n- eine gedruckte Einkaufsliste mit genauen Produktvorschlägen, oder\n- einen detaillierten Wochenplan mit Uhrzeiten für Ihren Tagesablauf.\n']
unterhaltung = []

for interaktion in Interaktionen:

    frage, antwort = interaktion.split("GPT-5 mini", 1)
    #print( f"FRAGE: {frage},\nANTWORT: {antwort} " )
    
    unterhaltung.append( { "FRAGE": frage, "ANTWORT": antwort } )

unterhaltung

                    
[{'FRAGE': ' 1 von 2 - 30.9.2025, 13:02:23:\nIch werde in 5 Jahren pensioniert und will noch Portraitzeichnen lernen. \n\n',
  'ANTWORT': ':\nSehr gut — 5 Jahre sind ein realistischer Zeitraum, um Portraitzeichnen sicher zu erlernen. Ich schlage einen strukturierten 5-Jahres-Plan mit konkreten Zielen, Lernressourcen, wöchentlichen Übungen und Meilensteinen vor.\n\nWelche dieser drei Optionen soll ich jetzt ausarbeiten?\n\n--------------------\n\n'},
 {'FRAGE': ' 2 von 2 - 30.9.2025, 13:03:06:\nWomit soll ich anfangen?\n\n',
  'ANTWORT': ':\nBeginnen Sie mit einem einfachen, fokussierten Starterprogramm, das drei Dinge kombiniert: Grundlagenübungen, Kopfkonstruktion und tägliche kurze Praxis. Das braucht nur 30–60 Minuten pro Tag.\n\nKonkreter 8‑Wochen Starterplan\nWenn Sie möchten, erstelle ich jetzt:\n- eine gedruckte Einkaufsliste mit genauen Produktvorschlägen, oder\n- einen detaillierten Wochenplan mit Uhrzeiten für Ihren Tagesablauf.\n'}]
konfdatei = """
user: busse
protocol: wlan
pass: 123geheim!

user: mueller
pass: abc
"""
konfdatei.split("\n\n")
['\nuser: busse\nprotocol: wlan\npass: 123geheim!',
 'user: mueller\npass: abc\n']
"\n\n   \n abc    ".strip()
'abc'
k2 = konfdatei.split("\n\n")
k2
['\nuser: busse\nprotocol: wlan\npass: 123geheim!',
 'user: mueller\npass: abc\n']
k3 = [ x.strip() for x in k2 ]
k3
['user: busse\nprotocol: wlan\npass: 123geheim!', 'user: mueller\npass: abc']
bsp = k3[0]
bsp
'user: busse\nprotocol: wlan\npass: 123geheim!'
[ zeile.split(":") for zeile in bsp.splitlines() ]
[['user', ' busse'], ['protocol', ' wlan'], ['pass', ' 123geheim!']]
{ zeile.split(":")[0] : zeile.split(":")[1].strip()    for zeile in bsp.splitlines() }
{'user': 'busse', 'protocol': 'wlan', 'pass': '123geheim!'}
k4 = []

for bsp in k3:
    k4.append(  { zeile.split(":")[0] : zeile.split(":")[1].strip()    for zeile in bsp.splitlines() }  )

k4
[{'user': 'busse', 'protocol': 'wlan', 'pass': '123geheim!'},
 {'user': 'mueller', 'pass': 'abc'}]
k4 = [  { zeile.split(":")[0] : zeile.split(":")[1].strip() for zeile in bsp.splitlines() }
      for bsp in [ x.strip() for x in konfdatei.split("\n\n") ]  ]
k4
[{'user': 'busse', 'protocol': 'wlan', 'pass': '123geheim!'},
 {'user': 'mueller', 'pass': 'abc'}]

z.B. BMI#

BMI: Quotient aus Körpergewicht (in kg) und Körpergröße (in m) zum Quadrat: kg / m^2 .

Aufgabe:

  • füge zu dem Dict den BMI hinzu!

Patienten = { 129345678:  # Patienten-ID
                { "name": "Müller, Heiz",
                 "birthdate": "1988-02-03",
                 "height": 1.75,
                 "weight": 95},
             239464964:
                { "name": "Maier, Erika",
                 "birthdate": "1989-08-03",
                 "height": 1.66,
                 "weight": 65}
            }
for pid, record in Patienten.items():
    bmi = record["weight"] / record["height"]**2
    print( pid, record, bmi)
    record["bmi"] = bmi
    
Patienten
129345678 {'name': 'Müller, Heiz', 'birthdate': '1988-02-03', 'height': 1.75, 'weight': 95} 31.020408163265305
239464964 {'name': 'Maier, Erika', 'birthdate': '1989-08-03', 'height': 1.66, 'weight': 65} 23.588329220496444
{129345678: {'name': 'Müller, Heiz',
  'birthdate': '1988-02-03',
  'height': 1.75,
  'weight': 95,
  'bmi': 31.020408163265305},
 239464964: {'name': 'Maier, Erika',
  'birthdate': '1989-08-03',
  'height': 1.66,
  'weight': 65,
  'bmi': 23.588329220496444}}

Aufgabe:

  • berechne avg, average

  • zentriere (avg soll 0 sein: von jeder Note den avg abziehen)

  • Varianz oder Standardabweichung ausrechnen

  • standardisiere: Varianz soll 1 sein

noten = [ 1,2,3,2,3,2,5,1]

avg = sum(noten) / len(noten)
avg
2.375
noten_zentriert = [  note - avg for note in noten  ]
noten_zentriert
[-1.375, -0.375, 0.625, -0.375, 0.625, -0.375, 2.625, -1.375]
noten_zentriert = []

for note in noten:
    zentrierter_wert = note - avg
    noten_zentriert.append( zentrierter_wert )

noten_zentriert
[-1.375, -0.375, 0.625, -0.375, 0.625, -0.375, 2.625, -1.375]
noten_zentriert = [  note - avg      for note in noten    ]
noten_zentriert
[-1.375, -0.375, 0.625, -0.375, 0.625, -0.375, 2.625, -1.375]
varianz = sum(  [ x*x for x in noten_zentriert]  ) / len(noten_zentriert)
varianz
1.484375
stdw = varianz**0.5
stdw
1.2183492931011204
noten_standardsiert = [ x/stdw   for x in noten_zentriert  ]
noten_standardsiert
[-1.1285761872936695,
 -0.30779350562554625,
 0.5129891760425771,
 -0.30779350562554625,
 0.5129891760425771,
 -0.30779350562554625,
 2.154554539378824,
 -1.1285761872936695]