Использование Python 2.7, я хочу, чтобы преобразовать строку в следующем формате списка списков:Преобразование строки в список списков
>>> value = "[[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]]"
>>> ...
>>> result = [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]]
мне удалось сделать это, но, кажется, неаккуратно ,
>>> value = "[[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]]"
>>> val2 = value.replace('[[', '').replace(']]', '').split('] [')
>>> val2
['1 0 0 0', '0 1 0 0', '0 0 1 0', '0 0 0 1']
>>> val_final = [[float(x) for x in x] for x in [x.replace(' ', '') for x in val2]]
>>> val_final
[[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]]
Есть ли лучше, чище способ сделать это, что было бы более надежным?
Примечание: Я ожидаю, что в строке будут иметь только целые или плавающие значения (контекст: это матрица 4x4, соответствующая позиции объекта в трехмерной среде).
Edit: Альтернативное значение может содержать поплавки, как так:
>>> value = "[[9.231 -0.123 -2 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]]"
>>> ...
>>> result = [[9.231, -0.123, -2.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]]
Спасибо за предложение @Johan Dahlin. Я сделал сравнение с 'timeit', а' eval' принимает '0.2819679792258256', а' json.loads' принимает '0.038535186478554806'. Учитывая, что мне нужно будет преобразовать тысячи значений, это более быстрое решение. –
В вашем ответе просто отсутствует преобразование в значения поплавка. –
@ HEADLESS_0NE Я обновил, чтобы преобразовать все числа в float, но это может быть немного медленнее при преобразовании большего набора данных. Для повышения производительности переключите библиотеку json на что-то вроде https://github.com/esnme/ultrajson –