У меня есть список с пустыми списками в нем:
list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
Как удалить пустые списки, чтобы получить:
list2 = ['text', 'text2', 'moreText']
Я попробовал list.remove(''), но это не работает.
У меня есть список с пустыми списками в нем:
list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
Как удалить пустые списки, чтобы получить:
list2 = ['text', 'text2', 'moreText']
Я попробовал list.remove(''), но это не работает.
Try
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
будет отфильтровывать все значения false из списка (который содержит пустой список)
list2 = filter(None, list1)
>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> list2 = [e for e in list1 if e]
>>> list2
['text', 'text2', 'moreText']
Я нашел этот вопрос, потому что хотел сделать то же самое, что и 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)
Несколько вариантов:
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, 'аа', 3,12, 'а', 'б', 'с', 'с'], [1, 'аа', 7,80 'д', 'г', 'F', ''], [9, Отсутствует, 11,12,13,14,15, 'к']]
list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
list2 = []
for item in list1:
if item!=[]:
list2.append(item)
print(list2)
выход:
['text', 'text2', 'moreText']