Мне нужно разделить список списков на список списков списков (проверить внутри)

#python

#python

Вопрос:

У меня есть список списков элементов, подобных этому:

 [['1 2 3 4 5', '6 7 8 9 10'], ['1 2 3 4 5', '6 7 8 9 10']]
  

и я хочу превратить это в это:

 [[['1', '2', '3', '4', '5'],
['6', '7', '8', '9', '10']],
[['1', '2', '3', '4', '5'],
['6', '7', '8', '9', '10']]
  

пока у меня есть этот код:

 for list in mylists[]:
    for items in list[]:
        items = items.split()
        print items
print mylists
  

Проблема, которую я получаю, заключается в том, что

         print items
  

выводит список списков так, как он должен (как я хочу, чтобы он выглядел), но затем

 print mylists
  

печатает список списков в его первоначальной форме (исходный список списков элементов).

Похоже, что редактирование списка на месте не выполняется, как будто редактирование выходит за рамки. Как я могу сохранить редактирование?

Я знаю, что этот код выглядит запутанным, поэтому прокомментируйте, если вам нужно разъяснение.

Комментарии:

1. Это не источник вашей проблемы, но это не может быть ваш код. for list in mylists[]: дало бы SyntaxError . Пожалуйста, всегда копируйте и вставляйте код и расшифровки в точности.

Ответ №1:

Использование map или понимания для создания нового списка:

 split_mylists = [[e.split() for e in x] for x in mylists]
  

Если вы хотите отредактировать на месте, вам нужно заменить элемент внутреннего массива:

 mylists = [['1 2 3 4 5', '6 7 8 9 10'], ['1 2 3 4 5', '6 7 8 9 10']]
for sublist in mylists:
    for i, items in enumerate(sublist):
        sublist[i] = items.split()
print mylists
  

В вашем коде (если бы он был синтаксически корректным) вы бы заменили значение локальной переменной items , которое не отражается на содержимом (несколько неудачно названного) списка list .

ОТРЕДАКТИРУЙТЕ для изменения имени переменной и уточните, что первый фрагмент создает новый список.

Комментарии:

1. Пробовал, не сработало : ( хотя спасибо! редактировать: обновил страницу, увидел ваше добавление. дайте мне секунду, чтобы попробовать! правка2: перечисление сработало! большое спасибо за вашу помощь. 1

2. «Не сработало» — бесполезный отчет. Что он сделал, чего вы не ожидали, и чего он не сделал, что вы сделали? Я сверил код с вашим mylists примером выше, и он действительно дает результат, который вы указываете в своей операции.

3. Исходный код представляет собой новое значение — как я уже сказал, он создает копию, а не редактирует на месте. Однако новое значение, если вы переназначите его исходной переменной, будет тем результатом, который вы хотите. Второй фрагмент фактически редактируется на месте. В вашем коде нет способа вернуть полное значение, поскольку вы вычисляете только вложенные значения, не сохраняя их нигде.

4. Я подумал, что установка «node = node.split()» будет тем, что мне нужно для хранения значений, но не так очевидно. Я предполагаю, что перечисление — это то, что мне нужно, чтобы сделать это правильно.

5. Суть перечисления в том, что оно дает вам индексы в исходном списке. Присвоение индексу объекта списка изменяет список, который работает. Но присвоение непосредственно имени, как в node = node.split() , не изменяет значение , оно повторно связывает имя . То есть это не приводит к тому, что исходный список волшебным образом превращается в результат split операции, но вместо этого это приводит к тому, node что вместо исходного списка он начинает быть именем для результата split операции.

Ответ №2:

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

 mydata = [['1 2 3 4 5', '6 7 8 9 10'], ['1 2 3 4 5', '6 7 8 9 10']]

outlist = []
for lst in mydata:
    level2 = []
    for item in lst:
        level3 = item.split()
        level2.append(level3)
    outlist.append(level2)
from pprint import pprint
pprint(outlist)
  

Выдает результат

 [[['1', '2', '3', '4', '5'], ['6', '7', '8', '9', '10']],
 [['1', '2', '3', '4', '5'], ['6', '7', '8', '9', '10']]]
  

Комментарии:

1. Ответ @ Amadan, конечно, является гораздо более кратким решением проблемы.