Cuando se sabe que una lista de Python siempre contiene un solo elemento, ¿hay alguna forma de acceder a ella que no sea:
mylist[0]
Puede preguntar: '¿Por qué querrías hacerlo?'. Curiosidad sola. Parece haber una forma alternativa de hacer todo en Python.
python
python-3.x
python-2.7
list
iterable-unpacking
Pyderman
fuente
fuente
list
no es el mejor tipo de datos?mylist[0]
tiene éxito cuando tiene al menos un elemento, pero no se queja si realmente tiene 30 elementos.singleitem, = mylist
verifica que tienes exactamente un elemento, ni más ni menos.Respuestas:
Secuencia de desembalaje:
singleitem, = mylist # Identical in behavior (byte code produced is the same), # but arguably more readable since a lone trailing comma could be missed: [singleitem] = mylist
Uso explícito del protocolo iterador:
singleitem = next(iter(mylist))
Pop destructivo:
Índice negativo:
singleitem = mylist[-1]
Establecer mediante iteración única
for
(porque la variable de bucle permanece disponible con su último valor cuando termina un bucle):for singleitem in mylist: break
Muchos otros (combinando o variando bits de los anteriores, o dependiendo de la iteración implícita), pero entiendes la idea.
fuente
singleitem = (lambda x: x)(*mylist)
[singleitem] = mylist
.[]
para el desempaquetado de secuencias (for [i, x] in enumerate(iterable):
me vuelve loco), pero sí, en el caso de desempaquetar un solo valor, la coma final se puede perder fácilmente, y el uso de corchetes es justificable por razones de legibilidad. Lo agregué a la respuesta. ¡Gracias!Agregaré que la
more_itertools
biblioteca tiene una herramienta que devuelve un elemento de un iterable.from more_itertools import one iterable = ["foo"] one(iterable) # "foo"
Además,
more_itertools.one
genera un error si el iterable está vacío o tiene más de un elemento.iterable = [] one(iterable) # ValueError: not enough values to unpack (expected 1, got 0) iterable = ["foo", "bar"] one(iterable) # ValueError: too many values to unpack (expected 1)
more_itertools
es un paquete de terceros> pip install more-itertools
fuente