Преобразовать список строк (с пробелами вместо запятых) в список списков - PullRequest
2 голосов
/ 14 января 2020

У меня есть следующая строка:

'[[ 0.03694573  0.01084746  0.01306414  0.00499198  0.00307188]\r\n [ 0.03780498  0.02610241  0.00967986  0.02228694 -0.01153102]\r\n [ 0.03837708  0.02111896  0.01370878 -0.00136839  0.01906253]\r\n [ 0.03490672 -0.02791057  0.08824896 -0.01991765  0.01964361]\r\n [ 0.0811892   0.28361901  0.21539196 -0.00259571  0.28737829]\r\n [ 0.20022041  0.16184418  0.25939959  0.00546446  0.36415219]\r\n [ 0.22920615  0.27439767  0.36991198  0.00624375  0.39911759]]'

Как видите, она состоит из списка списков. Однако каждый элемент в списках разделен вкладками, а не запятыми, поэтому ast.literal_eval() не работает. У кого-нибудь есть идеи, как лучше всего преобразовать это в список списков?

BJR

Ответы [ 3 ]

1 голос
/ 14 января 2020

Измените строку, пока она не будет интерпретирована как literal_eval. В основном это означает добавление "," где необходимо.

Если ваша строка называется data:

import ast
data = data.replace('  ', ',').replace('\r\n ', ',')
result = ast.literal_eval(dat2)

Теперь result будет содержать ваш список списков.

Я не уверен, есть ли у вас пробелы или табуляции. Если у вас есть вкладки, вам придется заменить ' ' на '\t\t'.

1 голос
/ 14 января 2020

Вот один из способов использования re.sub:

import re
literal_eval(','.join(re.sub(r'(?<=\d)(\s+)(?=-?\d)', ',', s).splitlines()))

[[0.03694573, 0.01084746, 0.01306414, 0.00499198, 0.00307188],
 [0.03780498, 0.02610241, 0.00967986, 0.02228694, -0.01153102],
 [0.03837708, 0.02111896, 0.01370878, -0.00136839, 0.01906253],
 [0.03490672, -0.02791057, 0.08824896, -0.01991765, 0.01964361],
 [0.0811892, 0.28361901, 0.21539196, -0.00259571, 0.28737829],
 [0.20022041, 0.16184418, 0.25939959, 0.00546446, 0.36415219],
 [0.22920615, 0.27439767, 0.36991198, 0.00624375, 0.39911759]]
0 голосов
/ 14 января 2020

Это грубая идея. Можно сделать меньше.

input = '[[ 0.03694573  0.01084746  0.01306414  0.00499198  0.00307188]\r\n [ 0.03780498  0.02610241  0.00967986  0.02228694 -0.01153102]\r\n [ 0.03837708  0.02111896  0.01370878 -0.00136839  0.01906253]\r\n [ 0.03490672 -0.02791057  0.08824896 -0.01991765  0.01964361]\r\n [ 0.0811892   0.28361901  0.21539196 -0.00259571  0.28737829]\r\n [ 0.20022041  0.16184418  0.25939959  0.00546446  0.36415219]\r\n [ 0.22920615  0.27439767  0.36991198  0.00624375  0.39911759]]'

input = input.replace('\r\n', ',')

array_of_arrays = input.split(',')
array_of_strings = []
for arr in array_of_arrays:
     _arr = arr.replace('[', '')
     _arr = _arr.replace(']', '')
     array_of_strings.append(_arr)
result = []
for arr in array_of_strings:
     num_strings = arr.split()
     num_arr = [float(x) for x in num_strings]
     result.append(num_arr)

print(result) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...