АЛГОРИТМ для создания одного списка из вложенных списков "X" в Python - PullRequest
0 голосов
/ 06 октября 2009

Какой самый простой способ создать этот список в Python?

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

oldList = [ [{'letter':'a'}], [{'letter':'b'}], [{'letter':'c'}] ]

Я хочу выплюнуть функцию:

newList = [ {'letter':a}, {'letter':'b'}, {'letter':'c'} ]

Ну, это можно сделать вручную. Однако, что если есть три вложенных ? ... X вложенный

Хитрый? :)

Ответы [ 5 ]

4 голосов
/ 06 октября 2009

Рекурсивные решения являются простейшими, но не более нескольких тысяч уровней вложенности, прежде чем вы получите исключение в отношении слишком глубокой рекурсии. Для реальной общности вы можете исключить рекурсию, сохранив свой собственный стек; итераторы - хорошие вещи для хранения в указанном стеке, и вся функция лучше всего написана как генератор (просто вызовите list(flatten(thelist)), если вы действительно хотите получить огромный список результатов).

def flatten(alist):
  stack = [iter(alist)]
  while stack:
    current = stack.pop()
    for item in current:
      if isinstance(item, list):
        stack.append(current)
        stack.append(iter(item))
        break
      yield item

Теперь это должно позволить вам обрабатывать столько уровней вложенности, сколько у вас есть для виртуальной памяти; -).

2 голосов
/ 06 октября 2009

http://www.daniel -lemire.com / блог / Архивы / 2006/05/10 / уплощения-листы-в-питон /

по этой ссылке (с парой незначительных изменений:

def flatten(l):
  if isinstance(l, list):
     return sum(map(flatten,l),[])
  else:
     return [l]
1 голос
/ 06 октября 2009

Самый простой ответ:

Только вы можете предотвратить вложенные списки

Не создавайте список списков, используя append. Создайте плоский список, используя extend.

0 голосов
/ 06 октября 2009

Я предпочитаю пост Алекса Мартелли как обычно. Просто хочу добавить не рекомендуемый трюк:

from Tkinter import _flatten
print _flatten(oldList)
0 голосов
/ 06 октября 2009

Поваренная книга Python Мартелли, Равенскрофт и Ашер 2005 О'Рейли также предлагает решение этой проблемы сглаживания. См. 4.6 Уплощение вложенной последовательности.
В этом решении используются генераторы, которые могут быть полезны, если списки длинные.
Кроме того, это решение одинаково хорошо справляется со списками или кортежами.

Примечание: упс ... Я немного поторопился. Я не уверен в законности воспроизведения этого фрагмента здесь ... позвольте мне искать политику / прецеденты в этой области.

Редактировать: позже нашел ссылку в качестве предварительного просмотра Google Книги.

Вот ссылка на этот раздел книги в Google books

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...