2009-03-03 338 views

Respuesta

36

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

Para los objetos de la lista, puede hacer algo como:

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

con ningún proceso especial que necesita.

También puede utilizar una de/en la declaración con enumerate (arr)

Ejemplo de encontrar el índice de un elemento que tiene un valor> 100.

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

Source

8

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

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

De Dive Into Python :

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

Gracias, esto era exactamente lo que estaba buscando, y funcionó perfectamente! –

+12

Pero este código da error cuando el elemento no está en la lista. En el contexto del ejemplo actual si busco 'tres' (es decir, li.index ('tres')) da error. –

+3

Puede detectar el error para detectar cuando algo no está en la lista. 'try: li.index (" tres ") excepto ValueError: found = false' –

6

El método de índice de un li st hará esto por ti. Si quiere garantizar el orden, ordene la lista primero usando sorted(). Ordenado acepta un cmp o parámetro clave para dictar la forma en la clasificación va a suceder:

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

O:

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

cómo es éste?

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) 
<generator object <genexpr> at ...> 
>>> list(_) 
[3, 4, 5] 
+3

Get pythonic: def global_index (lst, test): return (idx para idx, val en enumerate (lst) if test (val)) – recursive

+5

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

20

Aquí es otra manera usando listas por comprensión (algunas personas que le resulte discutible). Es muy accesible para pruebas simples, p. comparaciones sobre atributos de los objetos (que lo necesita una gran cantidad):

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.

+4

'el = [x para x en mylist si x.attr ==" foo "]' 'if el : hacer algo con el [0] ' resuelve el problema de" existencia " – berkus

12

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

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

Si lo que desea es averiguar si un elemento se encuentra en la lista o no:

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

que responde es el mejor! =) – holms

3

Encontré esto adaptando algunos tutos.Gracias a Google, y para 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 sencillo:

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

[2, 3] 

P. S. scuse mi Inglés

6

utilizo función para el retorno de índice para el elemento de adaptación (Python 2.6):

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

Entonces utilizarlo través de la función lambda para recuperar elemento necesario por 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 en mi código solo defino la función de búsqueda específica, p. Ej. para encontrar elemento por su nombre:

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

Y entonces es muy fácil y legible:

element = find_name(mylist,"my name") 
Cuestiones relacionadas