2011-01-30 8 views
30

У меня есть список с пустым списком в нем:Python: Как удалить пустые списки из списка?

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

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

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

Я попытался list.remove («»), но это Безразлично Не работай.

+2

'' '! = [] ', Поэтому' .remove' не работал. Но это все равно плохое решение (либо вы проверяете, есть ли перед этим '' [] в списке1' - «O (n ** 2)», либо уловите ошибку, которую он выбрал иначе - уродливый). – delnan

+1

так удивительно, когда вы нашли, что хотя ваш вопрос не является обычным явлением, но кто-то давно опубликовал его, и он был красиво ответил! Я люблю SO –

ответ

47

Попробуйте

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

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

list2 = [x for x in list1 if x] 
+0

+1 для упоминания другого способа, который приходит на ум и как он отличается. – delnan

+0

Я знаю, что это устарело, но я продолжаю видеть этот метод скобок, и я не могу найти что-либо с помощью Google (вероятно, потому, что Google не делает пунктуации). Что называется, так что я могу узнать больше о том, что на самом деле происходит там? – David

+1

@David: [List comprehensions] (https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) и [Генераторные выражения] (https://docs.python.org/3/tutorial /classes.html#generator-expressions). Есть также понимание слова и понимание. –

0

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

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

-1: 'len (x)> 0' по существу совпадает с' bool (x) 'или просто' x'. – lunaryorn

+1

или None для 'filter()' –

+0

+1: @RC. Если у вас есть типы номеров в списке, вы не можете вызвать len на нем. Если у вас есть «0», он будет отфильтрован «Нет». В противном случае мне нравится этот ответ. –

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

Может кто-нибудь, пожалуйста, отредактируйте это! Кажется, у меня нет вариантов форматирования. – user225312

+0

done (вам нужно использовать '{}') –

+0

@RC: Спасибо! Я знаю это, но по какой-то странной причине это не видно (нет опции). – user225312

36

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

list2 = filter(None, list1) 

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

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

+0

Почему этот ответ не имеет более приоритетов и/или является принятым ответом? –

+0

@ MattO'Brien b/c Многие программисты на Python избегают 'filter()', также как 'lambda',' map() 'и' reduce() '; это включает в себя [самого Гвидо] (http://www.artima.com/weblogs/viewpost.jsp?thread=98196), хотя это сообщение немного устарело. Я предпочитаю, чтобы в списках понимались б/с, ясность часто важнее, чем небольшое ускорение с помощью этих методов и оператора лямбды. При этом этот случай тривиален b/c, очень ясно, что намерение программиста. – BoltzmannBrain

5

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

list2 = filter(None, list1) 
1

Я нашел этот вопрос, потому что я хотел сделать то же самое, что и 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 (см this question найденных в то же время). Это небольшая разница, но она должна учитываться при разработке совместимых скриптов.

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

list3 = list(list2) 
0

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

0
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, 'd', 'G', 'е', ''], [9, Отсутствует, 11,12,13,14,15, 'к']]

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

мощность:

['text', 'text2', 'moreText'] 
+0

Код только ответы не очень полезны сами по себе. Это поможет, если вы можете добавить некоторые детали, объясняющие, как/почему он отвечает на вопрос. Тем не менее, я не уверен, что этот ответ добавляет ценность для всех остальных к этому пятилетнему вопросу. – SiHa

Смежные вопросы