2012-08-29 9 views
22

¿Hay alguna forma clara de obtener el valor en un índice de lista de None si el índice está fuera de rango en Python?Obtiene el valor en el índice de lista/matriz o "Ninguno" si está fuera de rango en Python

La manera obvia de hacerlo sería la siguiente:

if len(the_list) > i: 
    return the_list[i] 
else: 
    return None 

Sin embargo, el nivel de detalle reduce la legibilidad del código. ¿Hay un trazador de líneas limpio, simple y único que se pueda usar en su lugar?

+1

No creo que sea una buena idea. ¿Qué hay de las rebanadas? Índices negativos? La ambigüedad de una lista con una Ninguno en ella? –

+0

Posible duplicado de [Cómo obtener el enésimo elemento de una lista de Python o por defecto si no está disponible] (https://stackoverflow.com/questions/2492087/how-to-get-the-nth-element-of-a -python-list-or-a-default-if-not-available) – Rotareti

Respuesta

25

Probar:

try: 
    return the_list[i] 
except IndexError: 
    return None 

O, un trazador de líneas:

l[i] if i < len(l) else None 

Ejemplo:

>>> l=range(5) 
>>> i=6 
>>> print(l[i] if i < len(l) else None) 
None 
>>> i=2 
>>> print(l[i] if i < len(l) else None) 
2 
+3

Esto tiene el desafortunado efecto secundario de usar excepciones como flujo de control, que su original ya no tiene y esto no es mucho menos detallado. –

+0

Esto es de hecho mucho mejor que hacer, pero no es exactamente menos detallado, ¿verdad? – BrtH

+9

@DanielDiPaolo: en Python, se recomienda el uso de excepciones de esta manera y no se desaprueba. – BrtH

6
return the_list[i] if len(the_list) > i else None 
+0

manera más detallada imho ... –

+0

@JoranBeasley ¿Cómo es el mundo un trazador de líneas más detallado que varios varios declaraciones de línea? – semicolon

+3

@semicolon Porque la verbosidad no se basa únicamente en el número de líneas ... – Metalstorm

4

para sus propósitos puede excluir la parte else como None es obtener un rendimiento por defecto si un dado la condición no se cumple.

def return_ele(x, i): 
    if len(x) > i: return x[i] 

Resultado

>>> x = [2,3,4] 
>>> b = return_ele(x, 2) 
>>> b 
4 
>>> b = return_ele(x, 5) 
>>> b 
>>> type(b) 
<type 'NoneType'> 
8

Encuentro lista rebanadas bueno para esto:

>>> x = [1, 2, 3] 
>>> a = x [1:2] 
>>> a 
[2] 
>>> b = x [4:5] 
>>> b 
[] 

lo tanto, siempre acceder x [i: i + 1], si quieres x [i] . Obtendrá una lista con el elemento requerido si existe. De lo contrario, obtienes una lista vacía.

+2

Addendum: Esto se puede expandir para que sea 'my_list [idx: idx + 1] o" Default_value "'.¡Legible y sucinto! :) – Erich

+0

Esta debería ser la respuesta aceptada como una línea que evita un if y funciona con listas vacías. Funciona bien con listas creadas por comprensión de listas también: 'a = [1,3,5,7,9]; b = [num para num en a si num% 2 == 0] [0: 1] o "No evens found"; imprimir (b) No evens found' –

Cuestiones relacionadas