2013-12-04 5 views
2

Как из этого списка:Удалить все пустые вложенные списки

list = [ 
    [], 
    ['', 'subitem'], 
    [[]], 
    'item', 
    [ 
     'item', 
     'item', 
     [''], 
     [] 
    ], 
    [] 
] 

я могу получить это:

list = [ 
    ['subitem'], 
    'item', 
    [ 
     'item', 
     'item' 
    ] 
] 

Как удалить рекурсивно все пустые вложенные списки, нулевые строки и списки вложенные нулевые строки?

+2

Можете ли вы показать нам, что вы пробовали? Что не сработало? – tacaswell

+0

Что делать, если список просто '[]'? Должны ли мы попытаться каким-то образом удалить список верхнего уровня? – user2357112

+3

dont name your list 'list' – bcorso

ответ

2

Однострочные:

def remove_empty(l): 
    return tuple(filter(lambda x:not isinstance(x, (str, list, tuple)) or x, (remove_empty(x) if isinstance(x, (tuple, list)) else x for x in l))) 
2
def purify(l): 
    for (i, sl) in enumerate(l): 
     if type(sl) == list: 
      l[i] = purify(sl) 
    return [i for i in l if i != [] and i != ''] 

l1 = [ [], ['', 'subitem'], [[]], 'item', [ 'item', 'item', [''], [] ], [] ] 
print purify(l1) 

Печать:

[['subitem'], 'item', ['item', 'item']] 
+0

это также удаляет нули и Nones, попробуйте с 'l1 = [[], 0, None]' – alko

6

рекурсии:

def remove_lst(lst): 
    if not isinstance(lst, list): 
     return lst 
    else: 
     return [x for x in map(remove_lst, lst) if (x != [] and x != '')] 
+0

Выглядит очень красиво, но что я делаю неправильно ?: >>> block = [1, 2, [], [], [ '', [12]], 'сд'] >>> защиту remove_empty_nested_list (root_list): \t если не isinstance (root_list, список): \t \t возвращение root_list \t еще: \t \t возвращение [ \t \t \t х для х в карте ( \t \t \t \t remove_empty_nested_list, \t \t \t \t root_list \t \t \t), если ( \t \t \t \t root_list! = [] И \t \t \t \t root_list! = '' \t \t \t) \t \t] \t >>> remove_empty_nested_list (block) [1, 2, [], [], ['', [12]], 'sd'] – DmitryLogvinenko

+0

@DmitryLogvinenko вы скопировали с ошибкой. 'root_list! = []' является неправильным компарадионом. – alko

+0

@DmitryLogvinenko, alko is right, x! = [] Not root_lst. – realli

0

Может быть что-то вроде этого?

#!/usr/local/cpython-3.3/bin/python 

'''Demonstrate a way of removing empty lists and empty strings from a nested list''' 

import pprint 

def remove_empty_recursive(input_obj): 
    '''Remove empty lists and strings - worker function''' 
    if isinstance(input_obj, str): 
     if input_obj: 
      # it's a nonempty string, pass it through 
      return input_obj 
     else: 
      # string is empty, delete it 
      return None 
    elif isinstance(input_obj, list): 
     if input_obj: 
      new_obj = [] 
      for element in input_obj: 
       subresult = remove_empty_recursive(element) 
       if subresult is None: 
        pass 
       else: 
        new_obj.append(subresult) 
      if new_obj: 
       return new_obj 
      else: 
       return None 
     else: 
      return None 

def remove_empty(list_): 
    '''Remove empty lists and strings - user callable portion''' 
    result = remove_empty_recursive(list_) 
    return result 

def for_comparison(): 
    '''Show what the O.P. wanted, for comparison's sake''' 
    list_ = [ 
     ['subitem'], 
     'item', 
     [ 
      'item', 
      'item' 
     ] 
    ] 
    return pprint.pformat(list_) 

def main(): 
    '''Main function''' 

    list_ = [ 
     [], 
     ['', 'subitem'], 
     [[]], 
     'item', 
     [ 
      'item', 
      'item', 
      [''], 
      [] 
     ], 
     [] 
    ] 

    result = remove_empty(list_) 
    print('actual result:') 
    pprint.pprint(result) 
    print('desired result:') 
    print(for_comparison()) 

main() 

Если это не совсем так, вы можете поделиться более подробным примером того, что это не удается.

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