2009-03-03 24 views

risposta

36

Il modo migliore è probabilmente utilizzare il metodo list .index.

Per gli oggetti nella lista, si può fare qualcosa di simile:

def __eq__(self, other): 
    return self.Value == other.Value 

con qualsiasi trattamento speciale è necessario.

È inoltre possibile utilizzare una per/in dichiarazione con enumerate (arr)

Esempio di trovare l'indice di un elemento che ha valore> 100.

for index, item in enumerate(arr): 
    if item > 100: 
     return index, item 

Source

8

C'è il metodo index, i = array.index(value), ma non penso che sia possibile specificare un operatore di confronto personalizzato. Però non sarebbe difficile scrivere la propria funzione:

def custom_index(array, compare_function): 
    for i, v in enumerate(array): 
     if compare_function(v): 
      return i 
204

Da Dive Into Python :

>>> li 
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>> li.index("example") 
5 
+1

Grazie, questo era esattamente quello che stavo cercando, e ha funzionato perfettamente! –

+12

Ma questo codice dà errore quando l'elemento non è nella lista. Nel contesto di esempio corrente se cerco 'tre' (cioè: li.index ('tre')) restituisce un errore. –

+3

È possibile rilevare l'errore per rilevare quando qualcosa non è presente nell'elenco. 'prova: li.index (" tre ") eccetto ValueError: found = false' –

6

Il metodo di indicizzazione di un li st lo farà per te. Se si desidera garantire l'ordine, ordinare prima l'elenco utilizzando sorted(). Ordinati accetta un cmp o un parametro chiave per dettare come l'ordinamento accadrà:

a = [5, 4, 3] 
print sorted(a).index(5) 

Oppure:

a = ['one', 'aardvark', 'a'] 
print sorted(a, key=len).index('a') 
1

come va questo?

def global_index(lst, test): 
    return (pair[0] for pair in zip(range(len(lst)), lst) if test(pair[1])) 

Usage:

>>> global_index([1, 2, 3, 4, 5, 6], lambda x: x>3) 
<generator object <genexpr> at ...> 
>>> list(_) 
[3, 4, 5] 
+3

Ottieni pythonic: def global_index (lst, test): return (idx per idx, val in enumerate (lst) if test (val)) Filtro – recursive

+5

(lambda x: x> 3, [1,2,3,4,5,6]) –

20

Ecco un altro modo tramite di lista (alcune persone potrebbero trovare discutibile). È molto accessibile per i test semplici, ad es. i confronti su attributi degli oggetti (che ho bisogno di un sacco):

el = [x for x in mylist if x.attr == "foo"][0] 

Naturalmente questo presuppone l'esistenza (e, in realtà, unicità) di un elemento idoneo secondo l'ordine.

+4

'el = [x per x in mylist se x.attr ==" foo "]' 'se el : fare qualcosa con el [0] ' risolve il problema" esistenza " – berkus

12

supponendo che si vuole trovare un valore in una matrice NumPy, immagino qualcosa di simile potrebbe funzionare:

Numpy.where(arr=="value")[0] 
115

Se si desidera solo per scoprire se un elemento è contenuto nella lista o no:

>>> li 
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>> 'example' in li 
True 
>>> 'damn' in li 
False 
+3

la risposta è la migliore! =) – holms

3

Ho trovato questo adattando alcuni tutorial.Grazie a Google, e per tutti voi;)

def findall(L, test): 
    i=0 
    indices = [] 
    while(True): 
     try: 
      # next value in list passing the test 
      nextvalue = filter(test, L[i:])[0] 

      # add index of this value in the index list, 
      # by searching the value in L[i:] 
      indices.append(L.index(nextvalue, i)) 

      # iterate i, that is the next index from where to search 
      i=indices[-1]+1 
     #when there is no further "good value", filter returns [], 
     # hence there is an out of range exeption 
     except IndexError: 
      return indices 

Una molto semplice uso:

a = [0,0,2,1] 
ind = findall(a, lambda x:x>0)) 

[2, 3] 

P.S. Scuse mio inglese

6

uso funzione che restituisce indice del corrispondente elemento (Python 2.6):

def index(l, f): 
    return next((i for i in xrange(len(l)) if f(l[i])), None) 

Quindi utilizzare tramite funzione lambda per aver recuperato elemento necessario per qualsiasi equazione richiesto ad esempio usando il nome dell'elemento.

element = mylist[index(mylist, lambda item: item["name"] == "my name")] 

Se ho bisogno di usarlo in più punti nel mio codice, ho appena definito la funzione di ricerca specifica, ad es. per la ricerca di elementi per nome:

def find_name(l, name): 
    return l[index(l, lambda item: item["name"] == name)] 

E poi è abbastanza facile e leggibile:

element = find_name(mylist,"my name") 
Problemi correlati