2014-08-31 3 views
0

У меня есть вложенный список с элементами, которые сами являются списками. Я хочу, чтобы найти все подсписки и придавить их в виде единого списка:Python извлечь все подсписок из вложенного списка

Например:

[[a], [b,[c,[d,e]]], [f,g]] 

Я хочу иметь список, содержащий все существующие подсписки (сплюснутый) в первоначальном списке, то есть:

[[a], [b,c,d,e], [c,d,e], [d,e], [f,g]] 

Я использовал рекурсивную функцию, но проблема в том, что я получаю вложенные подсписки снова, который не то, что я хочу. Также мой вопрос не о flattening неправильных списках.

+3

Я бы не назвал эту операцию «сплющиванием» ... на вашем выходе, например элемент 'd' дублируется дважды. Это действительно то, что вы хотите? – roippi

+0

@roippi Да, это именно то, что я хочу, я хочу, чтобы все вхождения всех подписок в один список. – CentAu

+0

Нет, это не ответили! Он не сглаживает нерегулярный список. Если вы видите пример вывода, вы понимаете, что он не сглаживается. – CentAu

ответ

1

Мы будем использовать вспомогательную функцию, которая возвращает уплощенную форму вложенного списка и все подсписки:

def flattened_list_and_sublists(l): 
    # First return value is l, flattened. 
    # Second return value is a list of flattened forms of all nested sublists 
    # of l. 

    flattened = [] 
    flattened_sublists = [] 

    for i in l: 
     if isinstance(i, list): 
      i_flattened, i_flattened_sublists = flattened_list_and_sublists(i) 
      flattened += i_flattened 
      flattened_sublists.append(i_flattened) 
      flattened_sublists += i_flattened_sublists 
     else: 
      flattened.append(i) 
    return flattened, flattened_sublists 

Тогда функция, которую вы хотите возвращает второе возвращаемое значение функции выше:

def all_flattened_sublists(l): 
    l_flattened, l_sublists_flattened = flattened_list_and_sublists(l) 
    return l_sublists_flattened 
Смежные вопросы