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

listno 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, = mylistverifica 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] = mylistUso 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: breakMuchos 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_itertoolsbiblioteca tiene una herramienta que devuelve un elemento de un iterable.from more_itertools import one iterable = ["foo"] one(iterable) # "foo"Además,
more_itertools.onegenera 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_itertoolses un paquete de terceros> pip install more-itertoolsfuente