Как оптимально превратить многомерный список в один список элементов в Python?

Возможные дубликаты:
Создание списка из списка списков в Python
Сгладить (нерегулярный) список списков в Python

Введите список, например: [1,2, [3,4, [5,6,7, [8]]], [9], 10]

  • Рекурсивный код возвращает Нет
  • Рекурсивная подпапка поиска и возврата файлов в списке python
  • Почему список (my_list) изменяет объект?
  • Функция возвращает None после рекурсии
  • Python IOError: Errno 13 Разрешение отклонено
  • Непреднамеренная рекурсия Tkinter с командой меню ... причина?
  • Желаемый выход: [1,2,3,4,5,6,7,8,9,10]

    В настоящее время у меня есть следующая рекурсивная функция:

    def fix_list( li , l = [] ): for i in li: try: len( i ) fix_list( i, l ) except: l.append( i ) return l 

    Я чувствую, что try / except catch немного трюк и медленный, и мне интересно, есть ли лучший / более оптимизированный способ выполнения этой задачи. Весь ввод приветствуется.

  • вложенные словари или кортежи для ключа?
  • Найти индексы значения в матрице 2d
  • Как эффективно использовать SQLDB SScursor?
  • Оптимизация скоростей поиска в словаре Python путем сокращения размера ключа?
  • Рекурсивный метод для балансировки скобок
  • Почему список (my_list) изменяет объект?
  • 5 Solutions collect form web for “Как оптимально превратить многомерный список в один список элементов в Python?”

    Вот итеративная версия (первоначально вдохновленная Artiom Rudzenka's), которая изменяет список на месте с использованием назначения среза, а не создает новый список на каждом проходе. Интересно, что нужен только один проход через список! Мое использование enumerate() немного неортодоксально; Я использую его для отслеживания индекса в списке, который может увеличиваться по мере того, как я перебираю его, но фактически не использую фактический элемент списка.

     def flattened(items, seqtypes=(list, tuple)): items = items[:] # we will return a copy; remove to mutate original for i, _ in enumerate(items): while isinstance(items[i], seqtypes): items[i:i+1] = items[i] return items print flattened([1,2,[3,4,[5,6,7,[8]]],[9],10]) 

    Версия генератора:

     def flattener(items, seqtypes=(list, tuple)): items = items[:] for i, _ in enumerate(items): while isinstance(items[i], seqtypes): items[i:i+1] = items[i] yield items[i] print list(flattener([1,2,[3,4,[5,6,7,[8]]],[9],10])) 

    Ниже приведен list подкласс, который имеет метод flatten() . Подобно методам sort() и reverse() , этот мутирует список и возвращает None .

     class listy(list): def flatten(self, seqtypes=(list, tuple)): for i, _ in enumerate(self): while isinstance(self[i], seqtypes): self[i:i+1] = self[i] lst = listy([1,2,[3,4,[5,6,7,[8]]],[9],10]) lst.flatten() print lst 

    Редактирование: я значительно упростил это из моей первоначальной версии. Однако, я вижу, вопрос закрыт.

    См. Этот ответ :

     def flatten(l): for el in l: if isinstance(el, collections.Iterable) and not isinstance(el, basestring): for sub in flatten(el): yield sub else: yield el 

    Вот простой генератор, который делает это:

     def flatten(nested): for item in nested: if isinstance(item, collections.Iterable) and not isinstance(item, basestring): for inner_item in flatten(item): yield inner_item else: yield item 

    Не уверен, является ли он «оптимальным» или нет.

    Я пробовал решение ниже, и он работает:

     data = [1,2,[3,4,[5,6,7,[8]]],[9],10] while any(isinstance(x, list) for x in data): tmpLst = [] for x in data: if isinstance(x, list): tmpLst.extend(x) else: tmpLst.append(x) data = tmpLst 

    Другой подход.

     def flatten(old, new): for i in old: flatten(i, new) if isinstance(i, list) else new.append(i) return new if __name__ == '__main__': l1 = [1, 2, [3, 4, [5, 6, 7, [8]]], [9], 10] l2 = list() l3 = flatten(l1, l2) print l3 

    Упрощен, поэтому вам не нужно указывать и списывать список в список аргументов flatten.

     def rec_flatten(old, new=list()): for i in old: rec_flatten(i, new) if isinstance(i, list) else new.append(i) return new if __name__ == '__main__': l1 = [1, 2, [3, 4, [5, 6, 7, [8]]], [9], 10] x = rec_flatten(l1) print x 
    Python - лучший язык программирования в мире.