Woche 13#

Matrix transponieren#

Matrix_2mal3 = [  # 2 Zeilen, 3 Spalten, zeilenweise
    [ 11, 12, 13 ],
    [ 21, 22, 23 ]
]
Matrix_2mal3
[[11, 12, 13], [21, 22, 23]]
l0 = [ 11, 12, 13 ]
l1 = [ 21, 22, 23 ]
Matrix_2mal3 = [ l0, l1 ]
Matrix_2mal3
[[11, 12, 13], [21, 22, 23]]
Matrix_2mal3[0], Matrix_2mal3[1]
([11, 12, 13], [21, 22, 23])
dict( zip(l0, l1) )
{11: 21, 12: 22, 13: 23}
berlin = list( zip(l0, l1) )
berlin
[(11, 21), (12, 22), (13, 23)]
s0 = berlin[0]
s1 = berlin[1]
s2 = berlin[2]
s0, s1, s2
((11, 21), (12, 22), (13, 23))
list( zip(s0, s1, s2) )
[(11, 12, 13), (21, 22, 23)]

Aufgabe#

gegeben: zwei Listen:

l0 = [ "a", "b", "c" ]
l1 = [ 1, 2, 3 ]

Simulieren Sie zip()!

for x in l0:
    print(x)
a
b
c
for i in range(len(l0)):
    print( f"{i=}, {l0[i]=}, {l1[i]=}")
i=0, l0[i]='a', l1[i]=1
i=1, l0[i]='b', l1[i]=2
i=2, l0[i]='c', l1[i]=3
ergebnis = []

for i in range(len(l0)):
    print( f"{i=}, {l0[i]=}, {l1[i]=}")
    ergebnis.append( (l0[i], l1[i]) )

ergebnis
i=0, l0[i]='a', l1[i]=1
i=1, l0[i]='b', l1[i]=2
i=2, l0[i]='c', l1[i]=3
[('a', 1), ('b', 2), ('c', 3)]
ergebnis = [ (l0[i], l1[i])   for i in range(len(l0))   ]
ergebnis
[('a', 1), ('b', 2), ('c', 3)]

CSV + glob()#

import glob
location = "../breitbandmessung_LA_2026-01-13/"
#help( glob.glob )
messdateien_name = glob.glob("../breitbandmessung_LA_2026-01-13/*")
messdateien_name
['../breitbandmessung_LA_2026-01-13/Breitbandmessung_13_01_2026_09_44_31.csv',
 '../breitbandmessung_LA_2026-01-13/Breitbandmessung_13_01_2026_09_48_21.csv',
 '../breitbandmessung_LA_2026-01-13/Breitbandmessung_13_01_2026_09_47_06.csv']
datei = {}

for dateiname in messdateien_name:
    with open(dateiname) as f:
        datei[dateiname] = f.read()
datei
{'../breitbandmessung_LA_2026-01-13/Breitbandmessung_13_01_2026_09_44_31.csv': '"Messzeitpunkt";"Download (Mbit/s)";"Upload (Mbit/s)";"Laufzeit (ms)";"Test-ID";"Version";"Betriebssystem";"Internet-Browser";"Uhrzeit"\n"13.01.2026";"145,07";"25,68";"20";"a751a5c0ff4843b9a034fa8aa52f22326b136ae658b4c282c4d0ede3beb9e144";"4.59";"Linux";"Firefox 146.0";"09:43:56"',
 '../breitbandmessung_LA_2026-01-13/Breitbandmessung_13_01_2026_09_48_21.csv': '"Messzeitpunkt";"Download (Mbit/s)";"Upload (Mbit/s)";"Laufzeit (ms)";"Test-ID";"Version";"Betriebssystem";"Internet-Browser";"Uhrzeit"\n"13.01.2026";"150,02";"25,99";"19";"904249345e18d64af2c4906604d461bb7f481ac2b711e5b80be4ece31fb37f25";"4.59";"Linux";"Firefox 146.0";"09:48:18"',
 '../breitbandmessung_LA_2026-01-13/Breitbandmessung_13_01_2026_09_47_06.csv': '"Messzeitpunkt";"Download (Mbit/s)";"Upload (Mbit/s)";"Laufzeit (ms)";"Test-ID";"Version";"Betriebssystem";"Internet-Browser";"Uhrzeit"\n"13.01.2026";"152,00";"25,96";"18";"9a39a3bd62c499679570bae2f7f63a05444a2fe40a5135018d99a3868c41a1db";"4.59";"Linux";"Firefox 146.0";"09:47:02"'}
matrix = []

for dateiname, inhalt in datei.items():
    zweite_zeile = inhalt.split("\n")[1]
    zweite_zeile_gesplittet = zweite_zeile.split(";")
    matrix.append( zweite_zeile_gesplittet )
    # print( f"{len( zweite_zeile_gesplittet )}")
matrix
[['"13.01.2026"',
  '"145,07"',
  '"25,68"',
  '"20"',
  '"a751a5c0ff4843b9a034fa8aa52f22326b136ae658b4c282c4d0ede3beb9e144"',
  '"4.59"',
  '"Linux"',
  '"Firefox 146.0"',
  '"09:43:56"'],
 ['"13.01.2026"',
  '"150,02"',
  '"25,99"',
  '"19"',
  '"904249345e18d64af2c4906604d461bb7f481ac2b711e5b80be4ece31fb37f25"',
  '"4.59"',
  '"Linux"',
  '"Firefox 146.0"',
  '"09:48:18"'],
 ['"13.01.2026"',
  '"152,00"',
  '"25,96"',
  '"18"',
  '"9a39a3bd62c499679570bae2f7f63a05444a2fe40a5135018d99a3868c41a1db"',
  '"4.59"',
  '"Linux"',
  '"Firefox 146.0"',
  '"09:47:02"']]
for zeile in matrix:
    print(zeile[1])
"145,07"
"150,02"
"152,00"
list( zip(*matrix) )
[('"13.01.2026"', '"13.01.2026"', '"13.01.2026"'),
 ('"145,07"', '"150,02"', '"152,00"'),
 ('"25,68"', '"25,99"', '"25,96"'),
 ('"20"', '"19"', '"18"'),
 ('"a751a5c0ff4843b9a034fa8aa52f22326b136ae658b4c282c4d0ede3beb9e144"',
  '"904249345e18d64af2c4906604d461bb7f481ac2b711e5b80be4ece31fb37f25"',
  '"9a39a3bd62c499679570bae2f7f63a05444a2fe40a5135018d99a3868c41a1db"'),
 ('"4.59"', '"4.59"', '"4.59"'),
 ('"Linux"', '"Linux"', '"Linux"'),
 ('"Firefox 146.0"', '"Firefox 146.0"', '"Firefox 146.0"'),
 ('"09:43:56"', '"09:48:18"', '"09:47:02"')]

Übung Di 14:30 Uhr#

gegeben: Ein Dict für Geburtstage

"2005-01-03".split("-")
['2005', '01', '03']
geburtstage = { "Anna": "2012-01-02", "Ben": "2012-11-12", "Charly": "2014-01-02" }
g2 = { k: v.split("-") for k, v in geburtstage.items()   }
g2
{'Anna': ['2012', '01', '02'],
 'Ben': ['2012', '11', '12'],
 'Charly': ['2014', '01', '02']}

Ggesucht:

  • für jedes Jahr: Wer hat Geburtstag?

So etwa soll die Lösung aussehen:

g2_invers = { "2012": { "Anna", "Ben"} , "2014": {"Charly"} }
g2_invers
{'2012': {'Anna', 'Ben'}, '2014': {'Charly'}}

Wir machen das auch gleich für die Monate:

for k,v in g2.items():
    print(v[0], k)
2012 Anna
2012 Ben
2014 Charly
inverses_dict_jahr = {}
inverses_dict_monat = {}

for k,v in g2.items():
    #print(v[0], k)
    
    if v[0] not in inverses_dict_jahr.keys():
        inverses_dict_jahr[ v[0] ] = set()
    inverses_dict_jahr[ v[0] ].add( k )

    if v[1] not in inverses_dict_monat.keys():
        inverses_dict_monat[ v[1] ] = set()
    inverses_dict_monat[ v[1] ].add( k )


inverses_dict_jahr, inverses_dict_monat
({'2012': {'Anna', 'Ben'}, '2014': {'Charly'}},
 {'01': {'Anna', 'Charly'}, '11': {'Ben'}})

Fibonacci#

gegeben: zwei Anfangswerte einer verallgemeinderten Fibonacci-Reihe, z.B. 2 und 3, mit fib(0) == 2 und fib(1) == 3.

gesucht: Eine Funktion fib(n), die eine Liste mit den ersten n Fibonacci-Gliedern zurückgibt.

p = 0
q = 1

ergebnis = [ p ]
n = 5

for i in range(n):

    pq = p + q
    
    ergebnis.append(pq)

    p = q
    q = pq
    
ergebnis
[0, 1, 2, 3, 5, 8]
def fib_list(x, *, p=0, q=1 ):
    
    ergebnis = [ p, q ]
    
    for i in range(x):
    
        pq = p + q
        
        ergebnis.append(pq)
    
        p = q
        q = pq
   

    return ergebnis
def fibr(x, *, p=0, q=1 ):
    if x < 0:
        print( f"fib({x}) ist nicht definiert!")
        return None
    if x == 0:
        return p
    elif x == 1:
        return q
    else:
        return fibr(x-1) + fibr(x-2)
def fibr_liste(n):
    return [ fibr(x) for x in range(n+1) ]
fibr_liste(5)
[0, 1, 1, 2, 3, 5]
fib_list(n)
[0, 1, 1, 2, 3, 5, 8]

Fibonacci zurück#

https://www.codewars.com/kata/6965d769930fb2eff921668f

gegeben: ein x und ein y, z.B.

x = 398
y = 644

gesucht: p und q als Anfangsglieder eine verallgemeinerten Fibonacci-Reihe?

Korrigieren Sie folgenden Code!#

Das_kleine_Einmaleins = {}
for i in range(10):
    for j in range(10):
        Das_kleine_Einmaleins[ [i,j] ] = i*j        
print(Das_kleine_Einmaleins)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[37], line 4
      2 for i in range(10):
      3     for j in range(10):
----> 4         Das_kleine_Einmaleins[ [i,j] ] = i*j        
      5 print(Das_kleine_Einmaleins)

TypeError: unhashable type: 'list'

Gruppeneinteilung#

https://moodle.haw-landshut.de/course/view.php?id=7763#section-2

  • Gruppen 1 und 2: xxx Uhr

    • Gruppe 1: Raum C113

    • Gruppe 2: D1.04

  • Gruppen 3 und 4: yyy Uhr

    • Gruppe 3: Raum C113 *Gruppe 4: D1.04

Aufwärmübung#

gegeben: Ein Dict, welche Person sich zu welcher Prüfung angemeledet hat, z.B.

anmeldung = { 1000012: [ "prog1", "mathe1", "mathe1" ],
              1000013: [ "prog1", "zeichnen" ] }

gesucht:

  • Für jede Prüfung: Wie vielen Anmeldungen gibt es?

# Kontext
ergebnis = {}

# hier Ihre Lösung

for k, v in anmeldung.items():
    ...

ergebnis_1 = {}
for matrikelnummer, liste_von_pruefungen in anmeldung.items():
    ...# (so wäre es in der Aufgabenstellung)

    # so könnte Ihre Lösung aussehen
    for p in liste_von_pruefungen:
        if p not in ergebnis.keys():
            # initialisieren
            ergebnis_1[p] = set()
        ergebnis_1[p].add(matrikelnummer)
ergebnis_1
{'prog1': {1000013}, 'mathe1': {1000012}, 'zeichnen': {1000013}}
ergebnis = { k: len(v) for k,v in ergebnis_1.items() }
ergebnis
{'prog1': 1, 'mathe1': 1, 'zeichnen': 1}
ergebnis == {'mathe1': 1, 'zeichnen': 1, 'prog1': 1}
True
import pandas as pd
help(set)
Help on class set in module builtins:

class set(object)
 |  set(iterable=(), /)
 |
 |  Build an unordered collection of unique elements.
 |
 |  Methods defined here:
 |
 |  __and__(self, value, /)
 |      Return self&value.
 |
 |  __contains__(self, object, /)
 |      x.__contains__(y) <==> y in x.
 |
 |  __eq__(self, value, /)
 |      Return self==value.
 |
 |  __ge__(self, value, /)
 |      Return self>=value.
 |
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |
 |  __gt__(self, value, /)
 |      Return self>value.
 |
 |  __iand__(self, value, /)
 |      Return self&=value.
 |
 |  __init__(self, /, *args, **kwargs)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |
 |  __ior__(self, value, /)
 |      Return self|=value.
 |
 |  __isub__(self, value, /)
 |      Return self-=value.
 |
 |  __iter__(self, /)
 |      Implement iter(self).
 |
 |  __ixor__(self, value, /)
 |      Return self^=value.
 |
 |  __le__(self, value, /)
 |      Return self<=value.
 |
 |  __len__(self, /)
 |      Return len(self).
 |
 |  __lt__(self, value, /)
 |      Return self<value.
 |
 |  __ne__(self, value, /)
 |      Return self!=value.
 |
 |  __or__(self, value, /)
 |      Return self|value.
 |
 |  __rand__(self, value, /)
 |      Return value&self.
 |
 |  __reduce__(self, /)
 |      Return state information for pickling.
 |
 |  __repr__(self, /)
 |      Return repr(self).
 |
 |  __ror__(self, value, /)
 |      Return value|self.
 |
 |  __rsub__(self, value, /)
 |      Return value-self.
 |
 |  __rxor__(self, value, /)
 |      Return value^self.
 |
 |  __sizeof__(self, /)
 |      S.__sizeof__() -> size of S in memory, in bytes.
 |
 |  __sub__(self, value, /)
 |      Return self-value.
 |
 |  __xor__(self, value, /)
 |      Return self^value.
 |
 |  add(self, object, /)
 |      Add an element to a set.
 |
 |      This has no effect if the element is already present.
 |
 |  clear(self, /)
 |      Remove all elements from this set.
 |
 |  copy(self, /)
 |      Return a shallow copy of a set.
 |
 |  difference(self, /, *others)
 |      Return a new set with elements in the set that are not in the others.
 |
 |  difference_update(self, /, *others)
 |      Update the set, removing elements found in others.
 |
 |  discard(self, object, /)
 |      Remove an element from a set if it is a member.
 |
 |      Unlike set.remove(), the discard() method does not raise
 |      an exception when an element is missing from the set.
 |
 |  intersection(self, /, *others)
 |      Return a new set with elements common to the set and all others.
 |
 |  intersection_update(self, /, *others)
 |      Update the set, keeping only elements found in it and all others.
 |
 |  isdisjoint(self, other, /)
 |      Return True if two sets have a null intersection.
 |
 |  issubset(self, other, /)
 |      Report whether another set contains this set.
 |
 |  issuperset(self, other, /)
 |      Report whether this set contains another set.
 |
 |  pop(self, /)
 |      Remove and return an arbitrary set element.
 |
 |      Raises KeyError if the set is empty.
 |
 |  remove(self, object, /)
 |      Remove an element from a set; it must be a member.
 |
 |      If the element is not a member, raise a KeyError.
 |
 |  symmetric_difference(self, other, /)
 |      Return a new set with elements in either the set or other but not both.
 |
 |  symmetric_difference_update(self, other, /)
 |      Update the set, keeping only elements found in either set, but not in both.
 |
 |  union(self, /, *others)
 |      Return a new set with elements from the set and all others.
 |
 |  update(self, /, *others)
 |      Update the set, adding elements from all others.
 |
 |  ----------------------------------------------------------------------
 |  Class methods defined here:
 |
 |  __class_getitem__(object, /)
 |      See PEP 585
 |
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |
 |  __new__(*args, **kwargs)
 |      Create and return a new object.  See help(type) for accurate signature.
 |
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |
 |  __hash__ = None