¿Cómo elimino los elementos ''Ninguno'' del final de una lista en Python
(3)
Esta pregunta ya tiene una respuesta aquí:
- Eliminar elementos vacíos finales en una lista 12 respuestas
A tiene una lista que puede contener elementos que son Ninguno. Me gustaría eliminar estos elementos, pero solo si aparecen al final de la lista, entonces:
[None, "Hello", None, "World", None, None]
# Would become:
[None, "Hello", None, "World"]
He escrito una función, pero no estoy seguro de que esta sea la forma correcta de hacerlo en Python:
def shrink(lst):
# Start from the end of the list.
i = len(lst) -1
while i >= 0:
if lst[i] is None:
# Remove the item if it is None.
lst.pop(i)
else:
# We want to preserve ''None'' items in the middle of the list, so stop as soon as we hit something not None.
break
# Move through the list backwards.
i -= 1
También una lista de comprensión como alternativa, pero esto parece ineficiente y no más legible:
myList = [x for index, x in enumerate(myList) if x is not None or myList[index +1:] != [None] * (len(myList[index +1:]))]
¿Cuál es la forma pitónica de eliminar elementos que son ''Ninguno'' al final de una lista?
Descartar desde el final de una lista es eficiente.
while lst[-1] is None:
del lst[-1]
Agregue una protección para
IndexError: pop from empty list
si es necesario.
Depende de su aplicación específica si proceder con una lista vacía debe considerarse normal o una condición de error.
while lst and lst[-1] is None:
del lst[-1]
La forma más fácil probablemente sería lo que hiciste. Aquí hay una implementación conceptual más simple de eso:
def shrink(lst):
copy_lst = lst[:] # don''t modify the original
while copy_lst[-1] is None: # you can get the last element in 1 step with index -1
copy_list.pop()
return copy_lst
A partir de Python 3.8 y el operador de morsa, sería posible hacerlo en una lista de comprensión, pero esta es una solución hacky y no debe usarla:
def shrink(lst):
at_end = True
return reversed([(at_end := e is None and at_end, e)[1] for e in reversed(lst) if not at_end])
Si no desea modificar la lista, puede encontrar el primer índice de la derecha que no es Ninguno y dividirlo:
def shrink(l):
for i in range(len(l) - 1, -1, -1):
if l[i] is not None:
return l[:i + 1]
return l[:0]
Si desea modificar la lista en el lugar, puede eliminar el segmento:
def shrink(l):
for i in range(len(l) - 1, -1, -1):
if l[i] is not None:
break
else:
i = -1
del l[i + 1:]