#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, конечно, является гораздо более кратким решением проблемы.