Also ich habe eine Liste von Tupeln wie diese:
[(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
Möchte ich diese Liste für ein Tupel, dessen Zahlenwert ist gleich etwas.
So, dass wenn ich search(53)
wird es wieder der index-Wert von 2
Gibt es eine einfache Möglichkeit, dies zu tun?
InformationsquelleAutor der Frage hdx | 2010-05-26
InformationsquelleAutor der Antwort Ignacio Vazquez-Abrams
Können Sie eine list comprehension:
InformationsquelleAutor der Antwort Greg Hewgill
tl;dr
Einen generator-Ausdruck ist wahrscheinlich die performante und einfache Lösung für Ihr problem:
Erklärung
Gibt es mehrere Antworten, die eine einfache Lösung auf diese Frage mit Liste Verstehens.
Während diese Antworten sind vollkommen richtig, Sie sind nicht optimal.
Je nach Anwendungsfall kann es erhebliche Vorteile machen ein paar einfache änderungen.
Das Hauptproblem sehe ich mit mit Hilfe einer list comprehension für diesen Anwendungsfall ist, dass die gesamte Liste verarbeitet werden, obwohl Sie nur finden wollen 1 element.
Python bietet eine einfache Konstruktion ist ideal hier. Es heißt generator-Ausdruck. Hier ist ein Beispiel:
Können wir erwarten, dass diese Methode zum ausführen der im Grunde das gleiche wie Liste Verstehens in unserem trivialen Beispiel, aber was ist, wenn wir arbeiten gerade an einem größeren Datensatz?
Das ist, wo der Vorteil bei der Verwendung der generator-Methode ins Spiel kommt.
Eher als das konstruieren einer neuen Liste, verwenden wir Ihre bestehende Liste als unsere durchsuchbar, und verwenden Sie
next()
um das erste Element aus unserem generator.Betrachten können, wie diese Methoden durchführen, die unterschiedlich auf einigen größeren Daten-sets.
Es sind umfangreiche Listen, aus 10000000 + 1 Elemente, mit unserem Ziel am Anfang (am besten) oder am Ende (am schlechtesten).
Wir können bestätigen, dass diese beiden Listen führt gleichermaßen anhand der folgenden Liste Verständnis:
Liste Verstehens
"Worst case"
"Im besten Fall"
Generator-Ausdrücke
Hier ist meine Hypothese für Generatoren: wir werden sehen, dass Generatoren deutlich besser, im besten Fall, aber auch im schlimmsten Fall.
Dieser performance-Gewinn ist vor allem aufgrund der Tatsache, dass der generator ausgewertet wird träge, D. H. es wird nur berechnen, was erforderlich ist, um die Ausbeute einen Wert.
Schlimmsten Fall
Besten Fall
WAS?! Im besten Fall weggeblasen der Liste Verstehens, aber ich hatte nicht erwartet, das unsere schlimmsten Fall übertreffen die Liste Verstehens so weit.
Wie ist das? Ehrlich gesagt, ich könnte nur spekulieren, ohne weitere Forschung.
Nehmen alles mit einem Körnchen Salz, ich nicht ausgeführt haben robuste Profilierung hier, nur einige sehr grundlegende Tests. Dies sollte ausreichend sein, um zu schätzen, dass ein generator-Ausdruck ist performant für diese Art von Liste suchen.
Beachten Sie, dass dies alle grundlegenden, eingebauten python. Wir brauchen nicht zu importieren, alles, oder verwenden Sie keine Bibliotheken.
Sah ich erstmals diese Technik für die Suche in der Udacity cs212 natürlich mit Peter Norvig.
InformationsquelleAutor der Antwort Jon Surrell
Ihre Tupel sind im Grunde der Schlüssel-Wert-Paaren--ein python -
dict
- so:Bearbeiten -- aha, Sie sagen, Sie wollen, dass der index-Wert (53, "xuxa"). Wenn dies wirklichwas Sie wollen, Sie haben zu Durchlaufen, die auf der ursprünglichen Liste, oder vielleicht eine kompliziertere Wörterbuch:
InformationsquelleAutor der Antwort Andrew Jaffe
Hmm... naja, die einfache Möglichkeit, die mir einfällt, ist, es zu konvertieren, um ein dict
und Zugang
d[53]
.BEARBEITEN: Oops, falsch gelesen deine Frage das erste mal. Es klingt wie Sie wirklich wollen, um den index, wo eine bestimmte Anzahl gespeichert ist. In diesem Fall versuchen
statt ein einfaches, altes
dict
Konvertierung. Dannd[53]
2.InformationsquelleAutor der Antwort David Z
Angenommen, die Liste kann lang sein, und die zahlen wiederholen können, sollten Sie die SortedList Typ aus der Python-Modul sortedcontainers. Die SortedList-Typ wird automatisch beibehalten der Tupel in der Reihenfolge von Zahl und ermöglichen die schnelle Suche.
Beispiel:
Diese arbeiten viel schneller als die Liste Verständnis Vorschlag durch eine binäre Suche. Wörterbuch Vorschlag wird noch schneller aber wird nicht funktionieren, wenn es doppelte zahlen mit verschiedenen Saiten.
Wenn es doppelte zahlen mit verschiedenen Saiten dann brauchen Sie, um einen Schritt mehr:
Durch winkelhalbierenden 54, finden wir die end-index für unsere Scheibe. Diese werden deutlich schneller auf langen Listen, wie Sie im Vergleich mit den akzeptierten Antworten.
InformationsquelleAutor der Antwort GrantJ
Nur ein weiterer Weg.
InformationsquelleAutor der Antwort RussW
[k for k,v in l, wenn v =='delicia']
hier ist l die Liste der Tupel-[(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
Und statt der Umwandlung in ein dict, sind wir mit llist Verständnis.
*Key* in Key,Value in list, where value = **delicia**
InformationsquelleAutor der Antwort Mantej Singh