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



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



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


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



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


Я попробовал список.удалить ("), но это не работает.

771   9  

9 ответов:

Попробуйте

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

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

list2 = [x for x in list1 if x]

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

list2 = filter(None, list1)

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

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

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

list2 = filter(None, list1)
>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> list2 = [e for e in list1 if e]
>>> list2
['text', 'text2', 'moreText']

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

Итерационный способ (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)

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

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]
>>>

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

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,'aa', 3, 12, 'a', 'b', 'c', 's'], [1, 'aa', 7, 80, 'd', 'g', 'f',"], [9, Нет,11,12,13,14,15,'k']]

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

Вывод:

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

Comments

    Ничего не найдено.