Wie lösche ich ein Objekt in einer Liste, wenn es existiert?
Ich bin immer new_tag
aus einem Formular-Textfeld mit self.response.get("new_tag")
und selected_tags
von checkbox-Felder mit
self.response.get_all("selected_tags")
Kombiniere ich Sie so:
tag_string = new_tag
new_tag_list = f1.striplist(tag_string.split(",") + selected_tags)
(f1.striplist
ist eine Funktion, die Streifen Leerzeichen innerhalb der strings in der Liste.)
Aber in dem Fall, dass tag_list
leer ist (keine neuen tags eingegeben werden), aber es gibt einige selected_tags
new_tag_list
enthält eine leere Zeichenfolge " "
.
Beispielsweise aus logging.info
:
new_tag
selected_tags[u'Hello', u'Cool', u'Glam']
new_tag_list[u'', u'Hello', u'Cool', u'Glam']
Wie kann ich loswerden der leeren Zeichenkette?
Wenn es eine leere Zeichenfolge in der Liste:
>>> s = [u'', u'Hello', u'Cool', u'Glam']
>>> i = s.index("")
>>> del s[i]
>>> s
[u'Hello', u'Cool', u'Glam']
Aber, wenn es keine leere Zeichenfolge:
>>> s = [u'Hello', u'Cool', u'Glam']
>>> if s.index(""):
i = s.index("")
del s[i]
else:
print "new_tag_list has no empty string"
Aber das gibt:
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
if new_tag_list.index(""):
ValueError: list.index(x): x not in list
Warum geschieht dies, und wie kann ich es umgehen?
InformationsquelleAutor der Frage Zeynel | 2011-02-06
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Fast-englischen Stil:
Test-Präsenz mit der
in
operator, dann gelten dieremove
Methode.Den
remove
Methode entfernt nur das erste vorkommen vonthing
um zu entfernen alle Ereignisse, die Sie verwenden könnenwhile
stattif
.2) Duck-typedEAFP Stil:
Diese Schießen-erste-Fragen-Fragen-Letzte Haltung ist Häufig in Python. Statt testen Sie vorab, ob das Objekt geeignet ist, gerade die Durchführung der operation und fangen die entsprechenden Ausnahmen:
Natürlich die zweite Ausnahme-Klausel im obigen Beispiel ist nicht nur von fragwürdiger humor, aber völlig unnötig (der Punkt war, um zu veranschaulichen, duck-typing für Menschen, die nicht vertraut mit dem Konzept).
Wenn Sie erwarten, dass mehrere vorkommen von etwas:
Jedoch mit contextlib ' s zu unterdrücken() contextmanager (Einführung in python 3.4) der obige code kann vereinfacht werden zu:
Wieder, wenn Sie erwarten, dass mehrere vorkommen von etwas:
3) Funktionale Stil:
Etwa 1993, Python bekam
lambda
reduce()
filter()
undmap()
mit freundlicher Genehmigung von einem Lisp hacker, die Sie verpasst und eingereichten arbeiten-patches*. Sie könnenfilter
zum entfernen von Elementen aus der Liste:Es ist eine Abkürzung, die nützlich sein können für Ihren Fall: wenn Sie möchten, heraus zu filtern, leere Elemente (in der Tat Elemente, wo
bool(item) == False
wieNone
null, leere Zeichenketten oder andere leere Sammlungen), die Sie übergeben können, Keines wie das erste argument:filter(function, iterable)
verwendet werden, entspricht[item for item in iterable if function(item)]
(oder[item for item in iterable if item]
wenn das erste argumentNone
); in Python 3.x, es ist nun äquivalent zu(item for item in iterable if function(item))
. Der feine Unterschied ist, dass filter verwendet, um eine Liste, jetzt funktioniert es wie ein generator-Ausdruck - dies ist OK, wenn Sie nur Durchlaufen die gereinigten Liste und verwerfen es, aber wenn Sie wirklich brauchen eine Liste, die Sie haben, schließen Sie denfilter()
Anruf mit derlist()
Konstruktor.- filter
- zusammen mit Gefährtenmap
undreduce
(Sie sind noch nicht gegangen, aberreduce
verschoben in das functools - Modul, die einen Blick Wert ist, wenn Sie wie high-order-Funktionen).4) Mathematische Stil:
Liste Verstehens wurde der bevorzugte Stil für die Liste manipulation in Python-da eingeführt in version 2.0 von PEP 202. Die Logik dahinter ist, dass die Liste Verstehens bieten einen prägnanten Weg, um Listen erstellen in Situationen, in denen
map()
undfilter()
- und/oder verschachtelten Schleifen würde, die derzeit verwendet werden.Generator-Ausdrücke, die eingeführt wurden in der version 2.4 von PEP 289. Ein generator-Ausdruck ist besser für Situationen, in denen Sie nicht wirklich brauchen (oder wollen) , haben eine Liste erstellt, in Erinnerung - wie wenn Sie nur wollen, um die Iteration über die Elemente ein zu einer Zeit. Wenn Sie nur die Iteration über die Liste kann man sich einen generator-Ausdruck als lazy ausgewertet Liste Verständnis:
Hinweise
!=
stattis not
(der Unterschied ist wichtig)InformationsquelleAutor der Antwort Paulo Scardine
Beachten Sie, dass dies nur entfernen Sie eine Instanz des leeren string aus der Liste (wie würde der code auch haben). Können die Ihre Liste enthalten mehr als eines?
InformationsquelleAutor der Antwort Tim Pietzcker
Wenn
index
nicht finden, die die gesuchte Zeichenfolge, wirft Sie dasValueError
Sie sehen. Entwederfangen Sie die ValueError:
oder verwenden
find
gibt -1 in diesem Fall.InformationsquelleAutor der Antwort phihag
Eek, tun Sie nichts, was kompliziert ist : )
Nur
filter()
Ihre tags.bool()
zurückFalse
für leere Zeichenfolgen, so dass anstelle vonsollten Sie schreiben
oder noch besser, setze diese Logik innerhalb
striplist()
so, dass es nicht wieder leere Zeichenfolgen in den ersten Platz.InformationsquelleAutor der Antwort dfichter
Hinzufügen, dass diese Antwort für die Vollständigkeit, aber es ist nur verwendbar unter bestimmten Bedingungen.
Wenn Sie sehr große Listen, die Sie aus dem Ende der Liste vermeidet CPython-Interna zu müssen
memmove
für Situationen, in denen können Sie Sie neu, um der Liste. Es gibt ein performance-Gewinn zu entfernen aus dem Ende der Liste, da Sie nicht brauchen, ummemmove
jeder Artikel nach, die Ihr entfernen - einen Schritt zurück (1).Für one-off-Umzüge, der Leistungsunterschied ist vielleicht akzeptabel, aber wenn Sie eine große Liste und entfernen müssen viele Elemente - Sie werden wahrscheinlich feststellen, eine Leistung Treffer.
Obwohl zugegeben, in diesen Fällen, tun Sie eine vollständige Liste Suche wahrscheinlich einen performance-Engpass zu, es sei denn, die Elemente werden meist an der Vorderseite der Liste.
Diese Methode kann verwendet werden, um mehr effiziente Entfernung,
solange die Reihenfolge der Liste ist akzeptabel. (2)
Möchten Sie vielleicht zu vermeiden, dass ein Fehler ausgelöst wird, wenn die
item
ist nicht in der Liste.set
vor allem, wenn die Liste ist nicht dazu gedacht zum speichern von Duplikaten.In der Praxis aber möglicherweise müssen Sie zum speichern veränderlicher Daten, die nicht Hinzugefügt werden können, um eine
set
. Überprüfen Sie auch auf btree ist, wenn die Daten können bestellt werden.InformationsquelleAutor der Antwort ideasman42
Hier ist noch ein one-liner Ansatz zu werfen, die es gibt:
Es nicht erstellen Sie eine Liste kopieren, nicht machen Sie mehrere Durchläufe durch die Liste nicht erforderlich ist, zusätzliche exception-handling, und gibt die übereinstimmenden Objekt oder Keine, wenn es nicht eine übereinstimmung. Einziges Problem ist, dass es macht für eine lange Erklärung.
Im Allgemeinen, wenn Sie suchen für eine Einzeiler-Lösung, die keine exceptions werfen, next() ist der Weg zu gehen, denn es ist einer der wenigen, die Python-Funktionen, unterstützt ein Standard-argument.
InformationsquelleAutor der Antwort Dane White
Alles, was Sie tun müssen, ist dieses
aber diese Methode hat ein Problem. Sie haben etwas in der außer Ort
so fand ich dies:
InformationsquelleAutor der Antwort SollyBunny