Как разобрать строку без запятой в python списке? - PullRequest
1 голос
/ 17 апреля 2020

Я хочу разобрать строку, подобную этой, в список python:

"[[ 3.14  2.12] [1.11 2.22 ] [10.0 12.0]]"    # Not separated by comma

Я пытался использовать функцию eval(), но она не удалась с неверным синтаксисом. Есть ли другой способ легко разобрать такую ​​строку в список python?

Я надеюсь добиться получения реального списка python, подобного этому:

mylist = [[ 3.14,  2.12], [1.11, 2.22 ], [10.0, 12.0]]

и mylist[0] вернет [3.14, 2.12] и mylist[0][1] вернет 2.12.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2020

re.sub можно использовать для добавления запятой после каждого вложенного списка и номера.

import re

s = "[[ 3.14  2.12] [1.11 2.22 ] [10.0 12.0]]"

def add_comma(match):
    return match.group(0) + ','

s = re.sub(r'\[[0-9\.\s]+\]', add_comma, s)
s = re.sub(r'([0-9\.]+)', add_comma, s)
mylist = eval(s)
2 голосов
/ 17 апреля 2020

Это просто заменяет пустые пробелы запятыми, а затем с помощью модуля ast вы можете преобразовать строковое представление списков списков в список.

import ast
h = "[[3.14 2.12] [1.11 2.22] [10.0 12.0]]"
a = str(h).replace( ' ' , ',' )
x = ast.literal_eval(a)
print(x)

Вывод

[[3.14, 2.12], [1.11, 2.22], [10.0, 12.0]] # of type lists of list

Также обратите внимание, что это довольно наивный подход, поскольку для этого требуется, чтобы строковое представление списков списка было в правильном формате.

Например, это действительно [[3.14 2.12] [1.11 2.22] [10.0 12.0]], тогда как [[ 3.14 2.12] [1.11 2.22 ] [10.0 12.0]] это не так из-за наличия здесь пустых мест [[ 3.14] например.

1 голос
/ 17 апреля 2020
x= "[[3.14 2.12] [1.11 2.22] [10.0 12.0]]"
z=[y.strip().split(']')[0].split(' ') for y in x.split('[') if y!='']

Объяснение: Разделение x на

'[' produces-->['', '', '3.14 2.12] ', '1.11 2.22] ', '10.0 12.0]]']

Использование условия, если y! = '' Для этого разделения дает

['3.14 2.12] ', '1.11 2.22] ', '10.0 12.0]]']

Использование y.strip () удаляет дополнительные пробелы в конце каждого элемента. Разбор '' 'производит

 [['3.14 2.12', ''], ['1.11 2.22', ''], ['10.0 12.0', '', '']]

Теперь, как мы видим, только у 1-го элемента есть наши значения, возьмите index = 0 и разделите на' ', получается

 [['3.14', '2.12'], ['1.11', '2.22'], ['10.0', '12.0']]
...