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'
).Obtener un valor predeterminado en el índice fuera de rango en Python
¿Cómo puedo hacer esto?
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'
).Obtener un valor predeterminado en el índice fuera de rango en Python
¿Cómo puedo hacer esto?
En el espíritu del pitón de "pedir perdón, no permiso", aquí hay una manera:
try:
b = a[4]
except IndexError:
b = 'sss'
de alguna manera simple? – zjm1126
Si quieres un trazador de líneas, ponlo en una pequeña función auxiliar. –
@zjm: this * is * a simple way –
try:
b = a[4]
except IndexError:
b = 'sss'
una forma más limpia (sólo funciona si está utilizando un diccionario):
b = a.get(4,"sss") # exact same thing as above
Ésta es otra manera te pueden gustar (de nuevo, sólo para dicts):
b = a.setdefault(4,"sss") # if a[4] exists, returns that, otherwise sets a[4] to "sss" and returns "sss"
Debe definir la excepción para 'excepto:'. Por ejemplo, su excepción también se activa cuando la variable 'a' no está definida. – zoli2k
@Goose: empty 'except' es malo. Es mucho mejor decir 'excepto IndexError' –
@shakov, @Eli Bendersky: tienes razón. Fijo. –
¿Usar try/catch?
try:
b=a[4]
except IndexError:
b='sss'
En el espíritu no-Pitón de "pedir permiso, no perdón", aquí es otra manera:
b = a[4] if len(a) > 4 else 'sss'
lo estaba usando, es bueno ver la fiabilidad confirmada. Tiendo a evitar intentar (y atrapar) tanto como sea posible. –
También puede definir una función poco de ayuda 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 surgido una excepción del tipo e
; en ese caso, devuelve el valor y
. Uso:
b = default(lambda: a[4], IndexError, 'sss')
Editar: Hecho que coger sólo un tipo específico de excepción.
¡Sugerencias para mejorar aún son bienvenidas!
@Thomas: En mi humilde opinión, es poco elegante, y el 'todo excepto' es preocupante –
Hay una discusión en la lista de correo sobre un constructo como este: http://mail.python.org/pipermail/python-dev/2009- Agosto/091039.html – Thomas
Respuesta anterior, pero aún así. Python es uno de los pocos idiomas donde las excepciones se consideran buenas. A menudo se usa para control de flujo donde crea legibilidad. – Etse
Estoy a la orden de pedir permiso (es decir, no me gusta el método try
... except
). Sin embargo, el código obtiene 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')
'mylist [-1]' solo debe obtener el último elemento, pero su '' permiso de solicitud '' get_at' code _doesn't_ no se comportará así. Esto muestra una de las muchas razones por las que "pedir permiso" es simplemente la filosofía incorrecta: lo que está comprobando podría no coincidir con lo que haría el sistema. Es decir, no solo está tratando sistemáticamente de duplicar el trabajo que el sistema hace por usted, sino que puede hacer que ese trabajo duplicado resulte incorrecto. "pedir perdón" es ** mucho ** mejor. –
@Alex: buena captura, no pensé en eso. La poderosa sintaxis de las listas de Python hace que esto sea un poco más complicado ... * sin embargo *, no estoy de acuerdo con su extrapolación de este caso especial de que "pedir perdón" en general es bueno. Por supuesto, estoy predispuesto, ya que soy un gran defensor de la tipificación estática. Pero de todos modos, esa es la conclusión equivocada. Una mejor conclusión sería que mi análisis de requisitos era insuficiente (* y * tal vez que no hay una buena manera de obtener el comportamiento interno de una manera modificable sin duplicación de código o desencadenamiento de error. Lo que apunta a una mala API). –
Podrías salirte con la tuya si haces 'def get_at (array, index, default): try: return array [index] excepto IndexError: return default' – voyager
Dado que este es un google primero éxito, es probable que también vale la pena mencionar que el paquete de "colecciones" estándar tiene un "defaultdict" que proporciona una una solución más flexible a este problema.
Usted puede hacer cosas interesantes, por ejemplo:
twodee = collections.defaultdict(dict)
twodee["the horizontal"]["the vertical"] = "we control"
Usted puede crear su propia lista de clase:
class MyList(list):
def get(self, index, default=None):
return self[index] if len(self) > index else default
Usted puede utilizar de esta manera :
>>> l = MyList(['a', 'b', 'c'])
>>> l.get(1)
'b'
>>> l.get(9, 'no')
'no'
Para un caso común donde se desea que el primer elemento, que puede hacer
next(iter([1, 2, 3]), None)
Lo utilizo 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)
En el espíritu del pitón de bello es mejor que feo método Código de golf
, utilizando rebanada y desembalaje
b=a[4:4+1] or 'sss'
más agradable que una función de contenedor o try-catch en mi humilde opinión, pero intimidante para principiantes. Personalmente encuentro tupla desempacando a ser la forma más atractiva que la lista [#]
usando rebanar sin desembalar:
b,=a[4:5] or ['sss']
o, si usted tiene que hacer esto a menudo, y no les importa hacer un diccionario
d = dict(enumerate(a))
b=d.get(4,'sss')
Su primer ejemplo no funciona si la lista tiene más de 5 elementos. Y yendo con 'a [4: 5]' ya no es agradable ... –
'usando empalme sin desempaquetar" es lo que funciona para mí, ya que de lo contrario, el elemento devuelto era una lista de tamaño 1, no escalar. –
¿Por qué su primera respuesta tiene comas adicionales? Jugar en el intérprete de python: 'b, = a [4:] o 'sss',' es lo mismo que 'b = a [4:] o 'sss'' –
de otra manera:
b = (a[4:]+['sss'])[0]
Bien, entonces me gusta la falta de detalle. ¿Podrías explicar la sintaxis un poco? – froggythefrog
'a [4:]' crea una lista de elementos, desde (incluido) el índice 4. Esto da como resultado una lista vacía. '[1, 2, 3] [999:] == []' Así es como funciona la operación de corte. Si 'a' fuera' ['123', '2', 4, 5, 6] ', devolvería [5, 6]. Luego agrega el elemento 'sss', creando una nueva lista, que es '['sss']' en este caso. El último paso '[0]' simplemente toma el primer elemento, devolviendo ''sss'', pero habría devuelto' a [4] 'si existiera tal elemento' –
, una forma interesante de lograr esto. un poco en el lado ilegible. – Alex
Si está buscando una manera fácil de mantener de conseguir valores por defecto en el operador de índice encontré útil lo siguiente:
Si invalida operator.getitem
desde el módulo de operador para agregar un parámetro predeterminado opcional, obtiene un comportamiento idéntico al original mientras mantiene la compatibilidad con versiones anteriores.
def getitem(iterable, index, default=None):
import operator
try:
return operator.getitem(iterable, index)
except IndexError:
return default
Si usted está buscando un corte rápido para reducir el characterwise longitud del código, puede probar esto.
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 sólo es útil cuando ya no desea que la modificación adicional a la lista
es alguien que vino aquí falta la prueba de JS '|| default' o PHP '??'? lol – igorsantos07