tengo una lista:
i = [[1,2,3,[]],[],[],[],[4,5,[],7]]Quiero eliminar toda la lista vacía:
[[1,2,3],[4,5,7]]¿Cómo puedo hacer esto?
Aquí está mi código:
res = [ele for ele in i if ele != []]Use una función recursiva para eliminar la lista vacía de una lista.
Usando la recursión puede eliminar una lista vacía a cualquier profundidad:
def remove_nested_list(listt): for index, value in enumerate(reversed(listt)): if isinstance(value, list) and value != []: remove_nested_list(value) elif isinstance(value, list) and len(value) == 0: listt.remove(value) a = [[1, 2, 3, 0, []], [], [], [], [4, 5, [], 7]] print(f"before-->{a}") remove_nested_list(a) print(f"after-->{a}") before-->[[1, 2, 3, 0, []], [], [], [], [4, 5, [], 7]] after-->[[1, 2, 3, 0], [4, 5, 7]]Para eliminar listas vacías de la lista anidada arbitrariamente. Podemos usar la recursividad aquí. Aquí hay una manera simple de hacerlo. Necesitamos iterar a través de la lista y verificar si un elemento es una lista vacía. Si es así, entonces no lo agregamos a la lista final. Si no es una lista vacía, repetimos el proceso anterior.
def remove_empty(lst): return ( [remove_empty(i) for i in lst if i!=[]] if isinstance(lst, list) else lst )Producción:
i = [[1, 2, 3, []], [], [], [], [4, 5, [], 7]] print(remove_empty(i)) # [[1, 2, 3], [4, 5, 7]] # Example taken from iGian's answer ii = [[1, 2, 3, []], [], [], [], [4, 5, [], 7, [8, 9, [], [10, 11, []]]]] print(remove_empty(ii)) # [[1, 2, 3], [4, 5, 7, [8, 9, [10, 11]]]] Para verificar si un objeto es iterable usamos collection.abc.iterable
from collections.abc import Iterable all( isinstance(i, Iterable) for i in ([], tuple(), set(), dict(), range(10), (_ for _ in range(10))) ) # True Ahora, puede reemplazar isinstance(lst, list) con isinstance(lst, Iterable) para filtrar la lista vacía, es decir [] de cada iterable.
@Teepeemm señaló un maravilloso caso de esquina que todas las respuestas se perdieron.
Para resolverlo, necesitamos dos funciones recursivas, una para verificar si es una lista anidada vacía y la segunda para eliminar listas anidadas vacías.
def empty(lst): if lst == []: return True elif isinstance(lst, list): return all(empty(i) for i in lst) else: return False def remove_empty(lst): return ( [remove_empty(i) for i in lst if not empty(i)] if isinstance(lst, list) else lst ) i = [[1, 2, 3, [[]]]] remove_empty(i) # [[1, 2, 3]] remove_nested_list(i) # Muhammad Safwan's answer print(i) # [[1, 2, 3, []]] ii = [[1, 2, 3, [[], [[[[], []]]]]]] remove_empty(ii) # [[1, 2, 3]] remove_nested_list(ii) # Muhammad Safwan's answer print(ii) # [[1, 2, 3, [[[[]]]]]]Usaría un par de métodos que no mutan la lista original.
El primero simplemente elimina todas las listas vacías en una lista, no las anidadas:
def remove_empty_lists(lst): return [ e for e in lst if not (isinstance(e, list) and len(e)==0) ]El segundo método solo usa el primero de forma recursiva:
def deep_remove_empty_lists(lst): lst = remove_empty_lists(lst) return [ deep_remove_empty_lists(e) if isinstance(e, list) else e for e in lst ]Entonces, en el caso presentado:
i = [[1,2,3,[]],[],[],[],[4,5,[],7]] deep_remove_empty_lists(i) #=> [[1, 2, 3], [4, 5, 7]]O en un caso de anidamiento más profundo:
ii = [[1,2,3,[]],[],[],[],[4,5,[],7,[8, 9, [], [10, 11, []]]]] deep_remove_empty_lists(ii) #=> [[1, 2, 3], [4, 5, 7, [8, 9, [10, 11]]]]