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