Risposte:
Hmmm. C'è stata una risposta con una comprensione dell'elenco qui, ma è scomparsa.
Qui:
[i for i,x in enumerate(testlist) if x == 1]
Esempio:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Aggiornare:
Ok, vuoi un'espressione di generatore, avremo un'espressione di generatore. Ecco di nuovo la comprensione dell'elenco, in un ciclo for:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Ora costruiremo un generatore ...
>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
... print i
...
0
5
7
e abbastanza saggiamente, possiamo assegnarlo a una variabile e usarlo da lì ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
E pensare che scrivevo FORTRAN.
args = ['x', '-p1', 'v1', '-p2', 'v2']. Quindi il comando args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]ritorna'v1'
Che dire di quanto segue?
print testlist.index(element)
Se non sei sicuro che l'elemento da cercare sia effettivamente nell'elenco, puoi aggiungere un controllo preliminare, ad esempio
if element in testlist:
print testlist.index(element)
o
print(testlist.index(element) if element in testlist else None)
o il "modo pitonico", che non mi piace tanto perché il codice è meno chiaro, ma a volte è più efficiente,
try:
print testlist.index(element)
except ValueError:
pass
ValueError
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange invece di range come richiesto (vedi commenti).
xrangeè depresso in Python 3.x, poiché il nuovo rangeè il vecchioxrange
Ecco un altro modo per farlo:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
Prova il seguente:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Se l'elenco è diventato abbastanza grande e ti aspettavi di trovare il valore in un numero limitato di indici, considera che questo codice potrebbe essere eseguito molto più velocemente perché non devi ripetere tutti i valori dell'elenco.
lookingFor = 1
i = 0
index = 0
try:
while i < len(testlist):
index = testlist.index(lookingFor,i)
i = index + 1
print index
except ValueError: #testlist.index() cannot find lookingFor
pass
Se ti aspetti di trovare molto il valore, probabilmente dovresti semplicemente aggiungere "indice" a un elenco e stampare l'elenco alla fine per risparmiare tempo per ogni iterazione.
Penso che potrebbe essere utile utilizzare il metodo curselection () dalla libreria Tkinter:
from Tkinter import *
listbox.curselection()
Questo metodo funziona sui widget della casella di riepilogo di Tkinter, quindi dovrai costruirne uno anziché un elenco.
Questo restituirà una posizione come questa:
('0',) (anche se le versioni successive di Tkinter potrebbero invece restituire un elenco di ints)
Quale è per la prima posizione e il numero cambierà in base alla posizione dell'oggetto.
Per ulteriori informazioni, consultare questa pagina: http://effbot.org/tkinterbook/listbox.htm
Saluti.
Giusto per illustrare un esempio completo insieme al input_listquale ha searies1(esempio: input_list [0]) in cui si desidera series2cercare (esempio: input_list [1]) e ottenere indici di serie2 se esiste in serie1.
Nota: certain conditionandrai nell'espressione lambda se le condizioni sono semplici
input_list = [[1,2,3,4,5,6,7],[1,3,7]]
series1 = input_list[0]
series2 = input_list[1]
idx_list = list(map(lambda item: series1.index(item) if item in series1 else None, series2))
print(idx_list)
produzione:
[0, 2, 6]