Python: encontrar un elemento en una lista

¿Cuál es una buena manera de encontrar el índice de un elemento en una lista en Python?
Tenga en cuenta que la lista no puede ser ordenada.

¿Hay una manera de especificar qué operador de comparación utilizar?

La mejor manera es probablemente usar el método de lista .index .

Para los objetos en la lista, puedes hacer algo como:

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

Con cualquier procesamiento especial que necesite.

También puede usar una sentencia for / in con enumerate (arr)

Ejemplo de búsqueda del índice de un elemento que tiene un valor> 100.

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

Fuente

Desde Dive Into Python :

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

Si solo quiere saber si un elemento está contenido en la lista o no:

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

Aquí hay otra manera de usar la comprensión de lista (algunas personas pueden encontrarla discutible). Es muy accesible para pruebas simples, por ejemplo, comparaciones en atributos de objetos (que necesito mucho):

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

Por supuesto, esto supone la existencia (y, en realidad, la singularidad) de un elemento adecuado en la lista.

Suponiendo que desea encontrar un valor en una matriz numpy, supongo que algo como esto podría funcionar:

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

Existe el método de index , i = array.index(value) , pero no creo que pueda especificar un operador de comparación personalizado. Sin embargo, no sería difícil escribir tu propia función para hacerlo:

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

El método de índice de una lista lo hará por usted. Si desea garantizar el orden, ordene la lista primero usando sorted() . Ordenado acepta un parámetro de cmp o clave para dictar cómo se realizará la clasificación:

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

O:

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

Uso la función para devolver el índice para el elemento correspondiente (Python 2.6):

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

Luego, úselo a través de la función lambda para recuperar el elemento necesario mediante cualquier ecuación requerida, por ejemplo, usando el nombre del elemento.

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

Si necesito usarlo en varios lugares de mi código, simplemente defino una función de búsqueda específica, por ejemplo, para encontrar el elemento por nombre:

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

Y luego es bastante fácil y legible:

 element = find_name(mylist,"my name") 

Encontré esto adaptando algunos tutos. Gracias a google, ya todos ustedes;)

 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 

Un uso muy simple:

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

PS scuse my english

como esta este

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

Uso:

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