Estoy buscando un equivalente en python dictionary.get(key, default)para listas. ¿Hay algún modismo para obtener el enésimo elemento de una lista o un valor predeterminado si no está disponible?
Por ejemplo, dada una lista myList que me gustaría obtener myList[0], o 5 si myListes una lista vacía.
Gracias.

index == -1000000Debería volverdefault.x[index] if 0 <= index < len(x) else defaultSería mejor siindexalguna vez puede ser negativo.valid_index()es incorrecta. Los índices negativos son legales en Python, deberían serlo-len(l) <= index < len(l).Editar: eliminé la verificación de TypeError; probablemente sea mejor dejar que la persona que llama maneje esto.
fuente
Esto probablemente es mejor a medida que se
ahace más grandeEsto funciona porque si
a[n:]es una lista vacía sin => len(a)Aquí hay un ejemplo de cómo funciona esto
range(5)Y la expresión completa
fuente
next(iter(lst[i:i+1]), default)- Solo otra entrada en la críptica competencia de frases ingeniosas.Acabo de descubrir que:
iter(l)devuelve un iteradormyList,next()consume el primer elemento del iterador y genera unStopIterationerror, excepto si se llama con un valor predeterminado, que es el caso aquí, el segundo argumento,5Esto solo funciona cuando desea el primer elemento, que es el caso en su ejemplo, pero no en el texto de su pregunta, así que ...
Además, no necesita crear listas temporales en la memoria y funciona para cualquier tipo de iterativo, incluso si no tiene un nombre (vea el comentario de Xiong Chiamiov sobre la respuesta de gruszczy)
fuente
next(iter(myList[n:n+1]), 5)ahora funciona para elnelemento th.tryvariante no es de una sola línea (pregunte pedido por OP). Solo funciona para listas porquemyListes una lista según lo especificado por OP (para ser precisos, es algo indexable). Crear una copia en la memoria no es costoso aquí porque estoy creando una lista de un solo elemento (o ninguno) aquí. Claro, un poco por encima, pero no vale la pena mencionarlo a menos que lo haga millones de veces en un bucle. Por cierto, creo que crear y atrapar unaIndexErrorexcepción es probablemente más costoso.fuente
[] or ...hizo. Sin embargo, personalmente solo usaría la solución aceptada, ya que se lee fácilmente (para principiantes). De acuerdo, envolverlo en una 'definición' con comentarios haría que eso no sea un problema.L[n] == FalseoL[n] == NoneoL[n] == []o más globalmente todo lo que se evalúa como falsa?[False]es verdadero.myval = l[n:n+1] or [somedefault]que funcionaría bien?Hay una receta de itertools que hace esto para iterables generales. Para su comodidad, puede
> pip install more_itertoolsimportar e importar esta biblioteca de terceros que implementa tales recetas para usted:Código
Detalle
Aquí está la implementación de la
nthreceta:Al igual
dict.get(), esta herramienta devuelve un valor predeterminado para los índices que faltan. Se aplica a iterables generales:fuente
Una solución barata es realmente hacer un dict con enumerar y usar
.get()como de costumbre, comofuente
Combinando @ Joachim's con lo anterior, podría usar
Ejemplos:
O, tal vez más claro, pero sin el
lenfuente
Usando Python 3.4's
contextlib.suppress(exceptions)para construir ungetitem()método similar agetattr().fuente