2016-10-27 4 views
0

В настоящее время я ищу простой способ преобразования строки с помощью разделенных запятыми значений "[2323,1231.1,123123.2 ,21 ... ,2131]" в список значений или numpy.array значения. Я хочу, чтобы это было сделано максимально эффективно, есть ли команда python, которая может делать то, что я хочу?Сохраните строку значений для отображения значений?

ответ

3

Да, ast.literal_eval может это сделать:

>>> import ast 
>>> ast.literal_eval("[2323,1231.1,123123.2 ,21 ,2131]") 
[2323, 1231.1, 123123.2, 21, 2131] 
0

ast что @wim предположить, вероятно, лучший выбор; но есть несколько альтернатив:

In [2036]: txt="[2323,1231.1,123123.2 ,21 ,2131]" 

AST

In [2038]: ast.literal_eval(txt) 
Out[2038]: [2323, 1231.1, 123123.2, 21, 2131] 

JSON

In [2039]: import json 
In [2040]: json.loads(txt) 
Out[2040]: [2323, 1231.1, 123123.2, 21, 2131] 

прямые

In [2045]: [float(i) for i in txt[1:-1].split(',')] 
Out[2045]: [2323.0, 1231.1, 123123.2, 21.0, 2131.0] 

раз:

In [2043]: timeit ast.literal_eval(txt) 
10000 loops, best of 3: 37.7 µs per loop 
In [2044]: timeit json.loads(txt) 
100000 loops, best of 3: 9.57 µs per loop 
In [2046]: timeit [float(i) for i in txt[1:-1].split(',')] 
100000 loops, best of 3: 5.02 µs per loop 

С разными текстами относительные тайминги могут быть разными; способность обрабатывать отклонения от строкового отображения списка может отличаться.

Для удобства и устранения MATLAB np.matrix также может разбирать строку; но результат 2d и медленнее

In [2047]: np.matrix(txt) 
Out[2047]: 
matrix([[ 2.32300000e+03, 1.23110000e+03, 1.23123200e+05, 
      2.10000000e+01, 2.13100000e+03]]) 
In [2048]: timeit np.matrix(txt) 
10000 loops, best of 3: 184 µs per loop 

np.array также может обрабатывать список строк:

In [2050]: np.array(txt[1:-1].split(','),float) 
Out[2050]: 
array([ 2.32300000e+03, 1.23110000e+03, 1.23123200e+05, 
     2.10000000e+01, 2.13100000e+03]) 
In [2051]: timeit np.array(txt[1:-1].split(','),float) 
... 
100000 loops, best of 3: 9.03 µs per loop 
1
string_list = '[2323, 2324,2325,2326]' 
list_numbers = json.loads(string_list) 

просто!

Смежные вопросы