Wie kann man am schnellsten herausfinden, ob ein Wert in einer Liste (einer Liste mit Millionen von Werten) vorhanden ist und welchen Index er hat?
Ich weiß, dass alle Werte in der Liste eindeutig sind, wie in diesem Beispiel.
Die erste Methode, die ich ausprobiere, ist (3,8 Sekunden in meinem echten Code):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
Die zweite Methode, die ich ausprobiere, ist (2x schneller: 1,9 sec in meinem realen Code):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Vorgeschlagene Methoden von Stack Overflow-Benutzer (2.74 sec für meinen echten Code):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
In meinem echten Code benötigt die erste Methode 3,81 Sekunden und die zweite Methode 1,88 Sekunden. Es ist eine gute Verbesserung, aber:
Ich bin ein Anfänger in Python/Skripting, und gibt es einen schnelleren Weg, um die gleichen Dinge zu tun und mehr Verarbeitungszeit zu sparen?
Mehr spezifische Erklärung für meine Anwendung:
In der Blender API kann ich auf eine Liste von Partikeln zugreifen:
particles = [1, 2, 3, 4, etc.]
Von dort aus kann ich auf den Standort eines Partikels zugreifen:
particles[x].location = [x,y,z]
Und für jedes Teilchen prüfe ich, ob es einen Nachbarn gibt, indem ich jeden Teilchenstandort wie folgt durchsuche:
if [x+1,y,z] in particles.location
"Find the identity of this neighbour particle in x:the particle's index
in the array"
particles.index([x+1,y,z])
7 in a
Der klarste und schnellste Weg, dies zu tun.
Sie können auch ein "Set" verwenden, aber die Erstellung dieses Sets aus Ihrer Liste kann mehr Zeit in Anspruch nehmen, als durch schnellere Mitgliedschaftstests eingespart wird. Die einzige Möglichkeit, sicher zu sein, ist ein guter Benchmark. (dies hängt auch davon ab, welche Operationen Sie benötigen)
Sie können Ihre Einträge in ein Set einfügen. Set-Lookups sind sehr effizient.
Versuchen Sie es:
s = set(a)
if 7 in s:
# do stuff
edit In einem Kommentar sagen Sie, dass Sie den Index des Elements erhalten möchten. Leider haben Mengen keine Vorstellung von der Position eines Elements. Eine Alternative ist, die Liste vorzusortieren und dann jedes Mal die binäre Suche zu verwenden, wenn Sie ein Element finden müssen.
def check_availability(element, collection: iter):
return element in collection
Benutzung
check_availability('a', [1,2,3,4,'a','b','c'])
Ich glaube, dass dies der schnellste Weg ist, um herauszufinden, ob ein bestimmter Wert in einem Array enthalten ist.