Подтвердить что ты не робот

Python: Как удалить пустые списки из списка?

У меня есть список с пустыми списками в нем:

list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']

Как удалить пустые списки, чтобы получить:

list2 = ['text', 'text2', 'moreText']

Я попробовал list.remove(''), но это не работает.

4b9b3361

Ответ 1

Try

list2 = [x for x in list1 if x != []]

Если вы хотите избавиться от всего, что является "ложным", например. пустые строки, пустые кортежи, нули, вы также можете использовать

list2 = [x for x in list1 if x]

Ответ 2

Вместо определения списка вы можете использовать filter():

list2 = filter(None, list1)

Если None используется в качестве первого аргумента для filter(), он отфильтровывает каждое значение в данном списке, которое False в булевом контексте. Сюда входят пустые списки.

Это может быть немного быстрее, чем понимание списка, поскольку оно выполняет только одну функцию в Python, а остальное выполняется в C.

Ответ 3

Вызов filter с помощью None будет отфильтровывать все значения false из списка (который содержит пустой список)

list2 = filter(None, list1)

Ответ 4

>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> list2 = [e for e in list1 if e]
>>> list2
['text', 'text2', 'moreText']

Ответ 5

Я нашел этот вопрос, потому что хотел сделать то же самое, что и OP. Я хотел бы добавить следующее замечание:

Итеративный способ (user225312, Sven Marnach):

list2 = [x for x in list1 if x]

Вернет объект list в python3 и python2. Вместо этого путь фильтра (lunaryorn, Imran) будет по-другому вести себя над версиями:

list2 = filter(None, list1)

Он вернет объект filter в python3 и list в python2 (см. этот вопрос, найденный в то же время). Это небольшое различие, но при разработке совместимых скриптов оно должно учитываться.

Это не делает никаких предположений о возможностях этих решений. В любом случае объект фильтра можно вернуть в список, используя:

list3 = list(list2)

Ответ 6

Несколько вариантов:

filter(lambda x: len(x) > 0, list1)  # Doesn't work with number types
filter(None, list1)  # Filters out int(0)
filter(lambda x: x==0 or x, list1) # Retains int(0)

пробная сессия:

Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> filter(lambda x: len(x) > 0, list1)
['text', 'text2', 'moreText']
>>> list2 = [[], [], [], [], [], 'text', 'text2', [], 'moreText', 0.5, 1, -1, 0]
>>> filter(lambda x: x==0 or x, list2)
['text', 'text2', 'moreText', 0.5, 1, -1, 0]
>>> filter(None, list2)
['text', 'text2', 'moreText', 0.5, 1, -1]
>>>

Ответ 7

Мне нужно было фильтровать пустые элементы из более сложных вложенных объектов. Я сделал рекурсивную функцию для этого. Смотрите мой SO ответ здесь.

Ответ 8

a = [[1,'aa',3,12,'a','b','c','s'],[],[],[1,'aa',7,80,'d','g','f',''],[9,None,11,12,13,14,15,'k']]

b=[]
for lng in range(len(a)):
       if(len(a[lng])>=1):b.append(a[lng])
a=b
print(a)
  

[[1, 'аа', 3,12, 'а', 'б', 'с', 'с'], [1, 'аа', 7,80 'д', 'г', 'F', ''], [9, Отсутствует, 11,12,13,14,15, 'к']]

  

Ответ 9

list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
list2 = []
for item in list1:
    if item!=[]:
        list2.append(item)
print(list2)

выход:

['text', 'text2', 'moreText']