Ποιος είναι ο γρηγορότερος τρόπος για να μάθετε αν μια τιμή υπάρχει σε μια λίστα (μια λίστα με εκατομμύρια τιμές) και ποιος είναι ο δείκτης της;
Γνωρίζω ότι όλες οι τιμές στη λίστα είναι μοναδικές όπως σε αυτό το παράδειγμα.
Η πρώτη μέθοδος που δοκιμάζω είναι (3,8 sec στον πραγματικό μου κώδικα):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
Η δεύτερη μέθοδος που δοκιμάζω είναι (2 φορές πιο γρήγορη: 1.9 sec στον πραγματικό μου κώδικα):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Προτεινόμενες μέθοδοι από χρήστη του Stack Overflow (2,74 sec για τον πραγματικό μου κώδικα):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
Στον πραγματικό μου κώδικα, η πρώτη μέθοδος διαρκεί 3,81 sec και η δεύτερη μέθοδος διαρκεί 1,88 sec. Είναι μια καλή βελτίωση, αλλά:
Είμαι αρχάριος με την Python / scripting, και υπάρχει ένας ταχύτερος τρόπος για να κάνω τα ίδια πράγματα και να εξοικονομήσω περισσότερο χρόνο επεξεργασίας;
Πιο συγκεκριμένη επεξήγηση για την εφαρμογή μου:
Στο API του Blender μπορώ να έχω πρόσβαση σε μια λίστα σωματιδίων:
particles = [1, 2, 3, 4, etc.]
Από εκεί, μπορώ να έχω πρόσβαση στη θέση ενός σωματιδίου:
particles[x].location = [x,y,z]
Και για κάθε σωματίδιο ελέγχω αν υπάρχει κάποιος γείτονας αναζητώντας τη θέση κάθε σωματιδίου ως εξής:
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
Ο πιο ξεκάθαρος και γρήγορος τρόπος για να το κάνετε.
Μπορείτε επίσης να εξετάσετε το ενδεχόμενο να χρησιμοποιήσετε ένα set
, αλλά η κατασκευή αυτού του συνόλου από τη λίστα σας μπορεί να πάρει περισσότερο χρόνο από ό,τι θα εξοικονομήσει ο ταχύτερος έλεγχος συμμετοχής. Ο μόνος τρόπος για να είστε σίγουροι είναι να κάνετε καλή συγκριτική αξιολόγηση. (αυτό εξαρτάται επίσης από τις λειτουργίες που χρειάζεστε)
Θα μπορούσατε να βάλετε τα στοιχεία σας σε ένα set
. Οι αναζητήσεις συνόλων είναι πολύ αποδοτικές.
Δοκιμάστε:
s = set(a)
if 7 in s:
# do stuff
edit Σε ένα σχόλιο λέτε ότι θα θέλατε να πάρετε το δείκτη του στοιχείου. Δυστυχώς, τα σύνολα δεν έχουν καμία έννοια της θέσης του στοιχείου. Μια εναλλακτική λύση είναι να προ-ταξινομήσετε τη λίστα σας και στη συνέχεια να χρησιμοποιείτε τη δυαδική αναζήτηση κάθε φορά που πρέπει να βρείτε ένα στοιχείο.
def check_availability(element, collection: iter):
return element in collection
Χρήση
check_availability('a', [1,2,3,4,'a','b','c'])
Πιστεύω ότι αυτός είναι ο γρηγορότερος τρόπος για να μάθετε αν μια επιλεγμένη τιμή βρίσκεται σε έναν πίνακα.