Higher-Order-Funktionen
Verfasst: Mittwoch 8. Februar 2023, 20:54
Hallo, ich würde gerne eure Meinung hören zu folgenden Programm, also ob man sie noch etwas kompakter formulieren kann, aber ohne importierte Module, beziehungsweise ob sie im Großen und Ganzen die jeweilige Aufgabenstellung gut erfüllen (Ich bin frischer Anfänger). Bei der Lösung musste ich mich auf elementare Programmiermethoden beschränken, also auf gewöhnliche Schleifen etc. 
1. a) Man definiere eine Funktion, welche eine gegebene Liste filtert - und zwar unter Verwendung einer übergebenen Funktion, die für jedes Element True oder False zurückgibt. Man soll also die schon eingebaute filter-Funktion selber implementieren. Beispiel:
Meine Lösung einmal als mutierende Funktion und einmal nicht-mutierend:
Analog dazu Aufgabe b): Man definiere eine Funktion zip, welche zwei Listen als Eingabe erhält und diese elementweise mit einer übergebenen zweistelligen Funktion kombiniert. Die Ergebnisse der elementweisen Kombination sollen als neue Liste zurückgegeben werden. Man soll also die eingebaute zip-Funktion selbst implementieren.
Meine Lösung:

1. a) Man definiere eine Funktion, welche eine gegebene Liste filtert - und zwar unter Verwendung einer übergebenen Funktion, die für jedes Element True oder False zurückgibt. Man soll also die schon eingebaute filter-Funktion selber implementieren. Beispiel:
Code: Alles auswählen
res_a = filter_mut(list(range(12)), lambda x: x > 3)
# Ausgabe [4, 5, 6, 7, 8, 9, 10, 11]
Code: Alles auswählen
# definieren eine nicht-mutierende Funktion
def filter(liste, function):
# erzeugen leere Liste, in denen Elemente vorkommen werden, für die das Prädikat True ergibt
l = []
# jedes Element mit True als Rückgabewert wird hinzugefügt
for element in liste:
if function(element) == True:
l.append(element)
else:
pass
return l
# mutierende Funktion
def filter_mut(liste, function):
# legen index i fest
i = len(liste)
# prüfe für jedes Element (vom letzten zum ersten), ob Funktion False liefert
while i >= 1:
if function(liste[i-1]) == False:
# entferne Element, wenn False Rückgabewert ist
liste.remove(liste[i-1])
else:
pass
i -= 1
return liste
# Testprogramm
res1 = filter(list(range(10)), lambda x: x > 5)
res2 = filter(list(range(10)), lambda x: x%2 == 0)
print(res1) # Ausgabe [6, 7, 8, 9]
print(res2) # Ausgabe [0, 2, 4, 6, 8]
print()
res_a = filter_mut(list(range(10)), lambda x: x > 5)
res_b = filter_mut(list(range(10)), lambda x: x%2 == 0)
print(res_a) # Ausgabe [6, 7, 8, 9]
print(res_b) # Ausgabe [0, 2, 4, 6, 8]
Analog dazu Aufgabe b): Man definiere eine Funktion zip, welche zwei Listen als Eingabe erhält und diese elementweise mit einer übergebenen zweistelligen Funktion kombiniert. Die Ergebnisse der elementweisen Kombination sollen als neue Liste zurückgegeben werden. Man soll also die eingebaute zip-Funktion selbst implementieren.
Meine Lösung:
Code: Alles auswählen
def listToDict(a, k):
# Erstellen von Dictionary und Liste, die die Elemente der k-ten Spalte enthält
dc = {}
l = []
# Entfernen der k-ten Spalte der Tabelle und Hinzufügen dieser in eine separate Liste,
# die damit die Schlüssel des Dictionarys enthält
for i in range(len(a)):
l.append(a[i][k])
a[i].remove(a[i][k])
# jedem Schlüssel, also i-tem Element der sep. Liste, die restliche i-te Liste aus a zuordnen
for i in range(len(l)):
dc[l[i]] = a[i]
return dc
# Testprogramm
a = [["Mustermann", "Max", 1234],["Exemplaris", "Emilie", 7890]]
b = [["Mustermann", "Max", 1234, 'Berlin'],["Exemplaris", "Emilie", 7890, 'Kiel'],
["Richter", "Horst", 4444, 'München']]
d = listToDict(a, 2)
print(d)
d2 = listToDict(b,1)
print(d2)