У меня есть список строк:Преобразование строки из списка в список
['[12 9 15]','[98 12 18]','[56 45 45]']
, и я хочу, чтобы преобразовать его в
[[12,9,15],[98,12,18],[56,45,45]]
У меня есть список строк:Преобразование строки из списка в список
['[12 9 15]','[98 12 18]','[56 45 45]']
, и я хочу, чтобы преобразовать его в
[[12,9,15],[98,12,18],[56,45,45]]
Вы можете использовать split
внутри list comprehension, чтобы сделать это.
Как [1 2 3]
не правильное представление списка питона в строке, можно удалить скобки, чтобы получить '1 2 3'
, который по расщеплению становится ['1', '2', '3']
. Это можно легко преобразовать в целочисленный вложенный список, переведя его в int с помощью вызываемого int
.
>>> l = ['[12 9 15]','[98 12 18]','[56 45 45]']
>>> [[int(j) for j in i[1:-1].split()] for i in l]
[[12, 9, 15], [98, 12, 18], [56, 45, 45]]
Для дальнейшего чтения What does "list comprehension" mean? How does it work and how can I use it?
также работает с переменной float? –
@henshalom Да, используйте 'float' buitin.'[[float (j) для j в i [1: -1] .split()] для i в l]' –
Это работает, но когда я запускаю его в своем списке, я получаю [12, введите 15, введите 455 введите ... он пропускает строки –
ваших строк [12 9 15]
не отформатированные как списки питона (запятые отсутствуют). У вас есть несколько вариантов в зависимости от того, насколько надежным парсер должен быть:
import ast
out_list = []
for string_list in list_of_strings:
list_repr = ','.join(string_list.split())
out_list.append(ast.literal_eval(list_repr))
Это будет работать до тех пор, пока вы не имеете любые внутренние строки, отформатированные как:
'[ 12 9, 5]
(ведущего пространства испортит его)
Я думаю, что, вероятно, самый надежный анализатор, что я могу думать о том, чтобы удалить [
и ]
и их разобрать сами:
out_list = []
for string_list in list_of_strings:
str_items = string_list.replace('[', '').replace(']', '')
out_list.append([int(item) for item in str_items.split()])
Почему вы не идете по пути «replace»? 'string_list.replace ('', ',')'. Извиняюсь, если я чего-то не хватает. –
@BhargavRao - Если в 'string_list' содержится более одного места в строке, это не удастся. Мы хотим заменить последовательные прогоны пробелов одной запятой, а 'str.replace' не так хорошо работает. Это довольно простой 're.sub', если мы хотим пойти по этому маршруту, но я думал, что я бы избавил OP от необходимости изучать некоторые регулярные выражения для этой простой задачи. – mgilson
Пока струны достаточно регулярно, это должно работать:
>>> x = ['[12 9 15]','[98 12 18]','[56 45 45]']
>>> x = [[int(i) for i in string.strip('[]').split()] for string in x]
>>> x
[[12, 9, 15], [98, 12, 18], [56, 45, 45]]
Используйте регулярное выражение
[map(int, re.findall('\d+', item)) for item in x]
В случае это не всегда хорошо отформатированный.
>>> import re
>>> [map(int, re.findall('\d+', item)) for item in x]
[[12, 9, 15], [98, 12, 18], [56, 45, 45]]
И 'list (map (...))' on python3.x ... но я думаю, что это не имеет значения, поскольку он помечен 'python2.7'. – mgilson
Чем проще решение, тем лучше для других, чтобы понять.
Ну вот мое решение:
list_of_strings = ['[12 9 15]','[98 12 18]','[56 45 45]']
list_of_lists = [map(int, x[1:-1].split()) for x in list_of_strings]
Так что, используя список-понимание здесь. Функция «map» возвращает список. Код x[1:-1].split()
разделит каждую строку на символ пробела, и каждый токен последовательности будет преобразован в 'int', который является функцией, которую я передал функции карты.
Нужно больше объяснений по моему коду?
Пожалуйста, проверьте, полезно ли это.
>>> x = ['[12 9 15]','[98 12 18]','[56 45 45]']
>>> print eval(str([ item.replace(" ",",") for item in x ]).replace("'", ''))
[[12, 9, 15], [98, 12, 18], [56, 45, 45]]
Как вы закончили с [[[12 9 15] ',' [98 12 18] ',' [56 45 45] '] '? –