Qual è un buon modo per trovare l'indice di un elemento in una matrice in python? Si noti che la matrice non può essere ordinata. Esiste un modo per specificare quale operatore di confronto utilizzare?Python: trovare un elemento in una matrice
risposta
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
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
Da Dive Into Python :
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.index("example")
5
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')
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]
Ottieni pythonic: def global_index (lst, test): return (idx per idx, val in enumerate (lst) if test (val)) Filtro – recursive
(lambda x: x> 3, [1,2,3,4,5,6]) –
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.
'el = [x per x in mylist se x.attr ==" foo "]' 'se el : fare qualcosa con el [0] ' risolve il problema" esistenza " – berkus
supponendo che si vuole trovare un valore in una matrice NumPy, immagino qualcosa di simile potrebbe funzionare:
Numpy.where(arr=="value")[0]
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
la risposta è la migliore! =) – holms
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
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")
Grazie, questo era esattamente quello che stavo cercando, e ha funzionato perfettamente! –
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. –
È possibile rilevare l'errore per rilevare quando qualcosa non è presente nell'elenco. 'prova: li.index (" tre ") eccetto ValueError: found = false' –