2016-06-24 2 views

ответ

6

Вы можете использовать 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?

+0

также работает с переменной float? –

+0

@henshalom Да, используйте 'float' buitin.'[[float (j) для j в i [1: -1] .split()] для i в l]' –

+0

Это работает, но когда я запускаю его в своем списке, я получаю [12, введите 15, введите 455 введите ... он пропускает строки –

2

ваших строк [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()]) 
+0

Почему вы не идете по пути «replace»? 'string_list.replace ('', ',')'. Извиняюсь, если я чего-то не хватает. –

+1

@BhargavRao - Если в 'string_list' содержится более одного места в строке, это не удастся. Мы хотим заменить последовательные прогоны пробелов одной запятой, а 'str.replace' не так хорошо работает. Это довольно простой 're.sub', если мы хотим пойти по этому маршруту, но я думал, что я бы избавил OP от необходимости изучать некоторые регулярные выражения для этой простой задачи. – mgilson

2

Пока струны достаточно регулярно, это должно работать:

>>> 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]] 
1

Используйте регулярное выражение

[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]] 
+1

И 'list (map (...))' on python3.x ... но я думаю, что это не имеет значения, поскольку он помечен 'python2.7'. – mgilson

0

Чем проще решение, тем лучше для других, чтобы понять.

Ну вот мое решение:

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', который является функцией, которую я передал функции карты.

Нужно больше объяснений по моему коду?

0

Пожалуйста, проверьте, полезно ли это.

>>> 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]]