Για μια λίστα ["foo", "bar", "baz"]
και ένα στοιχείο στη λίστα "bar"
, πώς μπορώ να βρω το δείκτη του (1) στην Python;
>>> ["foo", "bar", "baz"].index("bar")
1
Αναφορά: Data Structures > More on Lists
Σημειώστε ότι ενώ αυτός είναι ίσως ο καθαρότερος τρόπος για να απαντήσετε στην ερώτηση όπως τέθηκε, το index
είναι ένα μάλλον αδύναμο συστατικό του API της list
, και δεν μπορώ να θυμηθώ την τελευταία φορά που το χρησιμοποίησα με θυμό. Μου επισημάνθηκε στα σχόλια ότι επειδή αυτή η απάντηση έχει πολλές αναφορές, θα πρέπει να γίνει πιο πλήρης. Ακολουθούν ορισμένες προειδοποιήσεις σχετικά με το list.index
. Αξίζει ίσως αρχικά να ρίξετε μια ματιά στο docstring γι' αυτό:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Μια κλήση index
ελέγχει κάθε στοιχείο της λίστας με τη σειρά, μέχρι να βρει μια αντιστοιχία. Αν η λίστα σας είναι μεγάλη, και δεν ξέρετε περίπου σε ποιο σημείο της λίστας εμφανίζεται, αυτή η αναζήτηση θα μπορούσε να γίνει ένα σημείο συμφόρησης. Σε αυτή την περίπτωση, θα πρέπει να εξετάσετε μια διαφορετική δομή δεδομένων. Σημειώστε ότι αν γνωρίζετε κατά προσέγγιση πού θα βρείτε την αντιστοιχία, μπορείτε να δώσετε στο index
μια υπόδειξη. Για παράδειγμα, σε αυτό το απόσπασμα, το l.index(999_999, 999_990, 1_000_000)
είναι περίπου πέντε τάξεις μεγέθους ταχύτερο από το απλό l.index(999_999)
, επειδή το πρώτο πρέπει να ψάξει μόνο 10 καταχωρήσεις, ενώ το δεύτερο ψάχνει ένα εκατομμύριο:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
Μια κλήση στο index
ψάχνει στη λίστα με τη σειρά μέχρι να βρει μια αντιστοιχία, και σταματάει εκεί. Αν περιμένετε να χρειαστείτε δείκτες περισσότερων αντιστοιχιών, θα πρέπει να χρησιμοποιήσετε μια κατανόηση λίστας, ή μια έκφραση γεννήτριας.
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
Στα περισσότερα μέρη όπου κάποτε θα χρησιμοποιούσα το index
, τώρα χρησιμοποιώ μια κατανόηση λίστας ή μια έκφραση γεννήτριας επειδή είναι πιο γενικεύσιμες. Έτσι, αν σκέφτεστε να φτάσετε στο index
, ρίξτε μια ματιά σε αυτά τα εξαιρετικά χαρακτηριστικά της python.
Μια κλήση στο index
καταλήγει σε ένα ValueError
αν το στοιχείο'δεν είναι παρόν.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Εάν το στοιχείο μπορεί να μην υπάρχει στη λίστα, θα πρέπει είτε να
item in my_list
(καθαρή, ευανάγνωστη προσέγγιση), ήindex
σε ένα μπλοκ try/except
που πιάνει το ValueError
(πιθανώς πιο γρήγορα, τουλάχιστον όταν η λίστα προς αναζήτηση είναι μεγάλη και το στοιχείο είναι συνήθως παρόν).Ένα πράγμα που είναι πραγματικά χρήσιμο στην εκμάθηση της Python είναι η χρήση της διαδραστικής βοήθειας:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
η οποία συχνά θα σας οδηγήσει στη μέθοδο που ψάχνετε.
Η index()
επιστρέφει τον πρώτο δείκτη της τιμής!
| index(...) | L.index(value, [start, [stop]]) -> integer -- επιστρέφει τον πρώτο δείκτη της τιμής
def all_indices(value, qlist):
indices = []
idx = -1
while True:
try:
idx = qlist.index(value, idx+1)
indices.append(idx)
except ValueError:
break
return indices
all_indices("foo", ["foo","bar","baz","foo"])