Преобразование строкового представления массива в фактический массив в python

Привет, я делаю некоторые вещи по сети и задаюсь вопросом, есть ли способ преобразования массива python в виде строки обратно в массив python. Например

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

преобразование x в

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'="">
>>>
</type>

numpy.array хотя и немного сложны из-за того, как 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]])
>>>


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


Попробуйте следующее:

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


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


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

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

licensed under cc by-sa 3.0 with attribution.