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 myList
es una lista vacía.
Gracias.
index == -1000000
Debería volverdefault
.x[index] if 0 <= index < len(x) else default
Sería mejor siindex
alguna 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
a
hace 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 unStopIteration
error, excepto si se llama con un valor predeterminado, que es el caso aquí, el segundo argumento,5
Esto 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 eln
elemento th.try
variante no es de una sola línea (pregunte pedido por OP). Solo funciona para listas porquemyList
es 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 unaIndexError
excepció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] == False
oL[n] == None
oL[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_itertools
importar e importar esta biblioteca de terceros que implementa tales recetas para usted:Código
Detalle
Aquí está la implementación de la
nth
receta: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
len
fuente
Usando Python 3.4's
contextlib.suppress(exceptions)
para construir ungetitem()
método similar agetattr()
.fuente