remove_all für Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich finde die LC wesentlich lesbarer als die Variante mit `filter()`.

Hier mal ein bißchen erweitert:

Code: Alles auswählen

In [1]: def remove_all(iterable, deletion):
   ...:     it = type(iterable)
   ...:     return it(elem for elem in iterable if elem != deletion)
   ...: 

In [2]: remove_all((3,2,4,6,4,3,2,5,3,2,1), 3)
Out[2]: (2, 4, 6, 4, 2, 5, 2, 1)
lunar

@snafu: Durch die Typmagie funktioniert die Funktion faktisch nur mit Listen und Tupeln, nicht aber mit beliebigen Iteratoren. Der Name "iterable" verspricht daher mehr, als die Funktion halten kann. Wenn Du ein "iterable" akzeptierst, dann gibt auch wieder ein "iterable" zurück. Dann kann man immer noch einen anderen Konstruktor aufrufen, wenn man das möchte ... allerdings bleibt von der Funktion dann eigentlich nicht mehr genug übrig, um sie noch als Funktion zu implementieren.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

In welchem konkreten Fall sollte sich die Funktion denn deiner Meinung nach nicht so verhalten, wie man es bei einem `iterable`-Argument erwartet?
BlackJack

@snafu: Es geht darum, dass es sich nicht nur wie ein "iterable" verhalten muss. Ein "iterable" wäre zum Beispiel ein Generatorausdruck. Damit kommt die Funktion aber nicht klar. Deshalb ist der Name sehr irreführend.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Okay, ich hätte die Funktion wirklich mit verschiedenen anderen Typen testen sollen. Da hab ich gestern offenbar gepennt.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

from operator import eq
from functools import partial
from itertools import ifilterfalse

ifilterfalse(partial(eq, 1), iterable)
Quasi einmal andersrum.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Also ein Litotes in Python :lol:
Antworten