Seite 1 von 1
for Schleife, Liste filtern
Verfasst: Sonntag 10. November 2019, 15:00
von Xerabell
Hey,
ich möchte eine Funktion schreiben, die ein Argument vom Typ "list" erwartet und von dieser eine copy erstellt. Diese copy soll am Ende aber nur die Elemente enthalten, die vom Typ "int" oder "float" sind, sowie in einem bestimmten Bereich z.b nur von 10 bis 30.
Ich habe schon alles mir bekannte versucht und komme nicht auf den richtigen Code.
Kann mir jemand helfen?
def filter_list (elements):
elements2 = elements.copy()
for n in elements2:
Re: for Schleife, Liste filtern
Verfasst: Sonntag 10. November 2019, 16:31
von Sirius3
Wie würdest Du denn den Typ einer Variable bestimmen? Oder wie würdest Du ermittelten ob erlittene Zahl im gewünschten Beitrag ist?
Statt die Liste zu kopieren, fang mit einer leeren Liste an und füge der nur dir gewünschten Elemente der übernehmen übergeben Liste hinzu.
Re: for Schleife, Liste filtern
Verfasst: Sonntag 10. November 2019, 16:36
von /me
Ich würde nicht den Ansatz nehmen die Liste zu kopieren und dann aus der Kopie alles unpassende rauszuwerfen. Stattdessen würde ich mit einer leeren Liste für das Ergebnis beginnen und dort alles aus dem Original hinzufügen, was die Bedingungen erfüllt.
edit: Wie Sirius auch schon schrieb während ich meine Antwort verfasste ...
Re: for Schleife, Liste filtern
Verfasst: Sonntag 10. November 2019, 19:16
von Xerabell
Erstmal Danke für die Antworten.
Jetzt habe ich es so gemacht:
def filter_list (elements):
elements2 = [ ]
for n in elements:
if n is type(0) or type(1.0):
if n >= 1 and n <= 50:
elements2.append(n)
continue
elif n is not type(0) or type(1.0):
continue
return elements2
assert filter_list([0,10,55]) == [10]
assert filter_list([10,"100", 10]) == [10, 10]
Nun macht mir aber der "str" Probleme.
TypeError: '>=' not supported between instances of 'str' and 'int'
Re: for Schleife, Liste filtern
Verfasst: Sonntag 10. November 2019, 19:23
von Xerabell
Hab es hinbekommen danke

Re: for Schleife, Liste filtern
Verfasst: Sonntag 10. November 2019, 19:36
von Sirius3
Eine Zahl oder ein String ist niemals vom Typ einer Zahl. Und `or` ist kein umgangssprachliches Oder, sondern ein logisches Oder bedeutet, entweder ist der Ausdruck vor dem or wahr oder der danach. Der davor ist es nie, der danach immer; die if-Abfrage ist also unsinnig, da immer wahr.
Das `continue´ solltest Du möglichst nicht benutzen und ist in Deinem Fall sogar komplett überflüssig. Was willst Du denn mit der elif-Bedingung ausdrücken?
Bleibt also:
Code: Alles auswählen
def filter_list (elements):
elements2 = []
for n in elements:
if n >= 1 and n <= 50:
elements2.append(n)
return elements2
Und da vergleichst Du Strings mit Zahlen, was natürlich nicht klappen kann. Typprüfung macht man mit `isinstance`.
Re: for Schleife, Liste filtern
Verfasst: Montag 11. November 2019, 09:47
von /me
Der Code geht beim Vergleich noch ein klein wenig schöner.
Code: Alles auswählen
def filter_list (elements):
elements2 = []
for n in elements:
if 1 <= n <= 50:
elements2.append(n)
return elements2
Jetzt brauchst du nur noch vor dem Vergleich auf den Wertebereich mit
isinstance überprüfen ob auch wirklich ein Integer- oder Float-Wert vorliegt.
Wenn du das hast, dann können wir auch gerne noch zeigen wie das alles mit einer List Comprehension zu einem Einzeiler wird.
Re: for Schleife, Liste filtern
Verfasst: Montag 11. November 2019, 17:23
von snafu
Ich würde ja eine Funktion für die Validierung basteln und davon abhängig die Liste aufbauen:
Code: Alles auswählen
def is_valid(n):
try:
return 1 <= n <= 50
except TypeError:
return False
numbers = [10, 0, -10, "100", "0", 1.0, -47.11, 42.0815]
print([n for n in numbers if is_valid(n)])