2012-06-11 3 views
-3

Я хочу узнать, как преобразовать список строк в список чисел.Как преобразовать список строк в числовые значения?

У меня есть форма PHP, через который пользователь вводит значения х и у, как это:

X: [1,3,4] 
Y: [2,4,5] 

Эти значения сохраняются в базе данных, как VARCHARS. Оттуда они вызываются программой python, которая должна использовать их как числовые (numpy) массивы. Однако они называются просто строками, что означает, что вычисление не может выполняться над ними. Есть ли способ преобразовать их в числовые массивы перед обработкой или есть что-то еще, что не так?

+1

Разберите строки и разделите их на массив. Это не сложно. [Попробовать что-нибудь] (http://whathaveyoutried.com). –

ответ

2

Вы можете использовать list comprehension вместе с функцией strip() и split(), чтобы превратить это в числовых значений.

x = '[1,3,4]' 
new_x = [int(i) for i in x.strip('[]').split(',')] 
new_x 
[1, 3, 4] 

Используйте этот список int с, как вы считаете нужным, например, передавая их на Numpy и т.д.

from numpy import array 

a = array(new_x) 
a 
array([1, 3, 4]) 

a * 4 
array([ 4, 12, 16]) 
+0

Спасибо, ребята. Но дело в том, что этот результирующий массив нельзя умножать или добавлять с любым другим массивом. То, что я хочу, чтобы эта вещь делала, - это возможность умножить и добавить как обычные числовые массивы. :/ – khan

+0

Я буду. Сегодня я отправлю свой полный фрагмент и код для публикации. Давайте посмотрим, можно ли это решить. – khan

+0

@khan мое решение дает вам номера, поэтому я не совсем уверен, что вы ищете. Я рассмотрю ваш обновленный вопрос. – Levon

1

Вот один из способов:

>>> import numpy 
>>> block = "[1,3,4]" 
>>> block = block.strip("[]") 
>>> a = numpy.fromstring(block, sep=",", dtype=int) 
>>> a 
array([1, 3, 4]) 
>>> a*2 
array([2, 6, 8]) 
+0

Он по-прежнему возвращается как строка. Я хочу сказать, что он должен быть возвращен как числовой массив. Например: >>> а = numpy.array ([2,3,4]) Теперь, когда мы делаем * 2: >>> а * 2 >>> массив ([4, 6,8]) Это идеальное решение. Я хочу, чтобы это произошло с моей строкой, но пока не в состоянии это сделать. :/ – khan

+0

Что? Это вовсе не строка. Это массивный массив. Я обновил ответ, чтобы, возможно, уточнить, что происходит. – jterrace

+0

Прошу прощения .. Я хотел сказать, что он возвращается как массив символов, а не массив числовых сущностей, которые имеют возможность складывать или умножаться на другой массив чисел, таких как матрицы. – khan

0
import ast 
import numpy as np 

def parse_array(s): 
    return np.array(ast.literal_eval(s)) 

s = '[1,2,3]' 
data = parse_array(s) # -> numpy.array([1,2,3]) 
+0

Это дает ошибку: AttributeError: объект 'module' не имеет атрибута 'array' – khan

+0

Отлично работает для меня - 32-разрядный Python 2.7.2, numpy 1.5.1, на 64-разрядной версии Windows 7 Pro –

0

Если я правильно поняли ваш вопрос, вы можете использовать встроенные функции eval() и compile() для достижения своей цели:

>>> lst_str = '[1,2,3]' 
>>> lst_obj = compile(lst_str, '<string>', 'eval') 
>>> eval(lst_obj) 
[1, 2, 3] 

Имейте в виду, что использование eval() таким образом, является потенциально небезопасным, однако, если вы не можете подтвердить ввод.

+1

'ast.literal_eval' безопаснее. –

+0

@PauloScardine, я бы предположил, что это должно быть, но пока я не прочитал пост Хью Ботвелла выше, я даже не знал, что он существует. Тем не менее, 'ast', по-видимому, не был добавлен до 2.6, поэтому метод' eval() 'может быть использован в старых версиях. –

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