2013-11-28 3 views
1

Привету делать некоторые вещи по сети и интересно, если есть способ преобразования массива питона как строка обратно в массив питона .. напримерПреобразование строкового представления массива фактического массив в Python

x = "[1,2,3,4]" 

преобразования х в

x_array = [1,2,3,4] 

бонус, если он может также работать для Numpy многомерных массивов!

ответ

5

Для обычных массивов используйте ast.literal_eval:

>>> from ast import literal_eval 
>>> x = "[1,2,3,4]" 
>>> literal_eval(x) 
[1, 2, 3, 4] 
>>> type(literal_eval(x)) 
<type 'list'> 
>>> 

numpy.array «s, хотя немного сложнее, потому что, как Python делает их как строки:

>>> import numpy as np 
>>> x = [[1,2,3], [4,5,6]] 
>>> x = np.array(x) 
>>> x 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> x = str(x) 
>>> x 
'[[1 2 3]\n [4 5 6]]' 
>>> 

Один хак вы могли бы использовать, хотя для простые заменяют пробелы запятыми, используя re.sub:

>>> import re 
>>> x = re.sub("\s+", ",", x) 
>>> x 
'[[1,2,3],[4,5,6]]' 
>>> 

Затем вы можете использовать ast.literal_eval и превратить его обратно в numpy.array:

>>> x = literal_eval(x) 
>>> np.array(x) 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> 
0

Если вы уверены, что струны всегда будут иметь такую ​​структуру, можно удалить скобки и разделить строку:

x_array = [int(y) for y in x[1:-1].split(',') if y.strip()] 
+0

' "[1, 2]"= [1, 2]' – akaRem

+0

akaRem ?? Это недопустимый синтаксис для списка. Всем всеравно. Предполагается, что строки содержат правильные представления списков. –

+0

Ooops .......... – akaRem

1

Я бы предположил, что вы на самом деле этого не хотите. Такие вещи не могут быть легко масштабируемы для отправки, например, экземпляров классов, которые вы определили по сети. Вместо этого я предлагаю вам использовать что-то вроде pickle или json для преобразования данных в байты, отправки их по сети и последующего преобразования данных. Однако в других ситуациях я всегда использовал бы ast.literal_eval. Если вы укажете, как вы отправляете данные по сети, я приведу вам пример использования pickle для вашей ситуации.

+0

+1 для упоминания рассола. – tawmas

1

Попробуйте это:

x_array = [(int(y) if y.strip() else None) for y in x[1:-1].split(',')] 
+0

+1 Однако, хотя я вижу, что вы пытаетесь сделать, я думаю, вы должны включить «список (фильтр (lamda x: x не None), вокруг этого, чтобы удалить значения« None ». – rlms

1
Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 
>>> import json 
>>> json.loads("[1,2,3,4]") 
[1, 2, 3, 4] 
>>> 
+1

почему вы оба ответьте и отметьте как дубликат? – njzk2

+0

, пожалуйста, прочтите это http://meta.stackexchange.com/questions/4283/closing-etiquette-why-do-some-answer-and-close – njzk2

+0

Также этот ответ уже упоминается в дублированном нить – njzk2

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