2009-03-16 18 views
7

Tengo una lista de enteros. Quiero saber si aparece el número 13 y, de ser así, dónde. ¿Debo buscar en la lista dos veces, como en el siguiente código?¿Las listas de Python tienen un equivalente a dict.get?

if 13 in intList: 
    i = intList.index(13) 

En el caso de los diccionarios, hay una función get que determinar la pertenencia y realizar consulta con la misma búsqueda. ¿Hay algo similar para las listas?

Respuesta

12

Lo ha contestado usted mismo, con el método index(). Eso será una excepción si no se encuentra el índice, por lo que sólo coger que:

def getIndexOrMinusOne(a, x): 
    try: 
    return a.index(x) 
    except ValueError: 
    return -1 
+0

Nunca use una cláusula vacía except. Deberías hacer, excepto IndexError. –

+0

que no funcionaría. [] .index() arroja un ValueError – SingleNegationElimination

+0

Probablemente está abusando de las listas si necesita hacer las cosas de esta manera; esto parece un olor a código. –

7

Parece que usted sólo tiene que detectar la excepción ...

try: 
    i = intList.index(13) 
except ValueError: 
    i = some_default_value 
-1

Sólo hay que poner lo que tiene una función y la usa :)

Puede usar if i in list: return list.index(i) o try/except, según sus preferencias.

3

No, no hay una coincidencia directa para lo que usted solicitó. Hubo a discussion a while back en la lista de correo de Python sobre esto, y la gente llegó a la conclusión de que probablemente era un olor a código si lo necesitabas. Considere utilizar dict o establecer en su lugar si necesita probar la membresía de esa manera.

+0

Creo que no leyó cuidadosamente la pregunta. – vartec

+0

Ah, whoops; tienes razón. ¡Fijo! –

+0

Esto simplemente condensa la sintaxis del ejemplo de código original. El problema de rendimiento no se trata. Python todavía prueba si el elemento en la lista primero, luego busca el índice del artículo en la lista. –

2

Usted puede detectar la excepción ValueError, o se puede hacer:

i = intList.index(13) if 13 in intList else -1 

(Python 2.5+)

cierto. si vas a hacer un gran lote de operaciones similares, podrías considerar construir un valor inverso de diccionario -> índice.

intList = [13,1,2,3,13,5,13] 
indexDict = defaultdict(list) 
for value, index in zip(intList, range(len(intList))): 
    indexDict[value].append(index) 

indexDict[13] 
[0, 4, 6] 
Cuestiones relacionadas