2014-02-03 24 views
-2

У меня есть большой массив под названием all_data_array:Удаление пустых элементов из массива/списка в Python

all_data_array = [[[], [], [], [], [], [], [], [], [], []], [[0, 1, 2, 3], ['foo', 'moo', 'bar', 'sis'], ['05-03-2014', '10-03-2014', '14-03-2014', '20-03-2014'], ['05-03-2014', '10-03-2014', '14-03-2014', '20-03-2014'], ['12:00', '12:03', '12:01', '12:01'], ['12:05', '12:08', '12:06', '12:06'], [123, 322, 345, 0], [1, 1, 1, 0], [1, 0, 1, 0], [0.1149597018957138, 0.920006513595581, 1.0062587261199951, 1.0062587261199951]]] 

В этом примере внутри all_data_array У меня есть два массива:
1. «пустой» один: [[], [], [], [], [], [], [], [], [], []]
2. Заполненная один (который очень долго), [[0, 1, 2, 3], ['foo', 'moo', 'bar', 'sis'], ['05-03-2014', '10-03-2014', '14-03-2014', '20-03-2014'], ['05-03-2014', '10-03-2014', '14-03-2014', '20-03-2014'], ['12:00', '12:03', '12:01', '12:01'], ['12:05', '12:08', '12:06', '12:06'], [123, 322, 345, 0], [1, 1, 1, 0], [1, 0, 1, 0], [0.1149597018957138, 0.920006513595581, 1.0062587261199951, 1.0062587261199951]]

Как я могу удалить из all_data_array всех пустых массивов? Раствор для примера просто all_data_array.pop[0], но я хотел бы иметь общее решение, если это возможно

я пытался что-то вроде этого, но это не работает, и я немного потерял:

for i in all_data_array: 
    for m in xrange(len(all_data_array)): 
     if m == []: 
      print "EMPTY" 
     else: 
      print "WITH CONTENT" 

Спасибо в advace

+0

replace 'if m == []:' with 'if not m:' –

+1

Что делать, если одно из подэлементов пуст? – thefourtheye

+0

Возможный дубликат [Удалить все пустые вложенные списки] (http://stackoverflow.com/questions/20368053/remove-all-empty-nested-lists) – FallenAngel

ответ

3

all Использование:

not_empty_ones = [] 

for el in all_data_array: 
    if all(el): 
     not_empty_ones.append(el) 
print not_empty_ones 

Так как это список, состоящий из самих списков, вам нужно проверить, все ли элементы внутри пусты или нет. Это может быть достигнуто с помощью all built-in.

+2

Я рекомендую использовать для этого понимание списка: '[el for el in all_data_array если все (el)] '. потому что чрезмерное использование 'append' занимает много памяти. – slallum

+0

+1 для tayfun для использования 'all' и +1 для slallum для использования понимания списка и указания вопроса об append – Nick

+0

'all' также будет исключать непустые списки со значениями, оценивающими false. например '[[0], [0]]' будут исключены. Если вы хотите сохранить такие элементы, я бы предложил использовать 'len (list (chain.from_iterable (array))). См. Мой ответ – wolfrevo

1

Вы попробовали?

all_data_array_no_empty = [x for x in all_data_array if all(x)] 
+0

Почему? list1 = [[], [1,2,3], [], [], ['a', 'b']] list2 = [x для x в списке1, если x! = []] получил [[1, 2, 3], ['a', 'b']] –

+0

@AshwiniChaudhary точно. –

+0

@amit Взгляните сначала на вход OP. –

0

это будет делать это, несмотря на длину пустой массив/список:

from itertools import chain 
[array for array in all_data_array if len(list(chain.from_iterable(array))) > 0] 

если ваши списки не являются пустыми вы получите разные результаты, если вы используете all вместо len(list(chain.from_iterable(array))) > 0:

>>> all_data_array = [[[0], []], [[1, 1, 1]]] 
>>> [l for l in all_data_array if len(list(chain.from_iterable(l))) > 0] 
[[[0], []], [[1, 1, 1]]]  # <-- element [[0], []] will be included 
>>> [el for el in all_data_array if all(el)] 
[[[1, 1, 1]]]     # <-- element [[0], []] will be excluded 
Смежные вопросы