Obtención de un valor predeterminado en el índice fuera de rango en Python

a=['123','2',4] b=a[4] or 'sss' print b 

Quiero obtener un valor predeterminado cuando el índice de la lista está fuera de rango (aquí: 'sss' ).

¿Cómo puedo hacer esto?

En el espíritu de Python de “pedir perdón, no permiso”, aquí hay una manera:

 try: b = a[4] except IndexError: b = 'sss' 

En el espíritu no python de “pedir permiso, no perdón”, aquí hay otra forma:

 b = a[4] if len(a) > 4 else 'sss' 

En el espíritu Python de bello es mejor que feo.

Codifique el método de golf, usando rebanar y desempaquetar (no estoy seguro si esto era válido hace 4 años, pero está en Python 2.7 + 3.3)

 b,=a[4:5] or ['sss'] 

Mejor que una función de envoltorio o de prueba de captura, pero intimidante para los principiantes. Personalmente, me parece que desempacar tuple es mucho más sexy que en la lista [#]

utilizando rebanar sin desembalar:

 b = a[4] if a[4:] else 'sss' 

o, si tienes que hacer esto a menudo, y no te importa hacer un diccionario

 d = dict(enumerate(a)) b=d.get(4,'sss') 

de otra manera:

 b = (a[4:]+['sss'])[0] 

Podrías crear tu propia lista de clases:

 class MyList(list): def get(self, index, default=None): return self[index] if len(self) > index else default 

Puedes usarlo así:

 >>> l = MyList(['a', 'b', 'c']) >>> l.get(1) 'b' >>> l.get(9, 'no') 'no' 

También podría definir una pequeña función auxiliar para estos casos:

 def default(x, e, y): try: return x() except e: return y 

Devuelve el valor de retorno de la función x , a menos que haya generado una excepción de tipo e ; en ese caso, devuelve el valor y . Uso:

 b = default(lambda: a[4], IndexError, 'sss') 

Edición : Hizo que capturara solo un tipo específico de excepción.

¡Las sugerencias para mejorar aún son bienvenidas!

Para un caso común donde desea el primer elemento, puede hacer

 next(iter([1, 2, 3]), None) 

Uso esto para “desenvolver” una lista, posiblemente después de filtrarla.

 next((x for x in [1, 3, 5] if x % 2 == 0), None) 

o

 cur.execute("SELECT field FROM table") next(cur.fetchone(), None) 
 try: b = a[4] except IndexError: b = 'sss' 

Una forma más limpia (solo funciona si estás usando un dictado):

 b = a.get(4,"sss") # exact same thing as above 

Aquí hay otra forma que te puede gustar (de nuevo, solo para dicts):

 b = a.setdefault(4,"sss") # if a[4] exists, returns that, otherwise sets a[4] to "sss" and returns "sss" 

Estoy a favor de pedir permiso (es decir, no me gusta el tryexcept método). Sin embargo, el código se vuelve mucho más limpio cuando se encapsula en un método:

 def get_at(array, index, default): if index < 0: index += len(array) if index < 0: raise IndexError('list index out of range') return array[index] if index < len(a) else default b = get_at(a, 4, 'sss') 

Dado que este es un gran éxito de Google, probablemente también vale la pena mencionar que el paquete estándar de “colecciones” tiene un “defaultdict” que proporciona una solución más flexible para este problema.

Puedes hacer cosas bonitas, por ejemplo:

 twodee = collections.defaultdict(dict) twodee["the horizontal"]["the vertical"] = "we control" 

Lea más: http://docs.python.org/2/library/collections.html

Si está buscando una forma de obtener valores predeterminados en el operador de índice, encontré la siguiente información útil:

Si reemplaza operator.getitem del módulo del operador para agregar un parámetro predeterminado opcional, obtendrá un comportamiento idéntico al original y mantendrá la compatibilidad con versiones anteriores.

 def getitem(iterable, index, default=None): import operator try: return operator.getitem(iterable, index) except IndexError: return default 

¿Usando try / catch?

 try: b=a[4] except IndexError: b='sss' 

Si está buscando un truco rápido para reducir la longitud del código, puede intentarlo.

 a=['123','2',4] a.append('sss') #Default value n=5 #Index you want to access max_index=len(a)-1 b=a[min(max_index, n)] print(b) 

Pero este truco solo es útil cuando ya no desea más modificaciones a la lista