учитывая список строк Python, как я могу автоматически преобразовать их в их корректный тип? Значение, если я имею:
["hello", "3", "3.64", "-1"]
Я хотел бы, чтобы это было преобразовано в список
["hello", 3, 3.64, -1]
где первый элемент является строкой, второе интервал, третье плавание и четвертое интервал.
как я могу сделать это?спасибо.
import ast
L = ["hello", "3", "3.64", "-1"]
def tryeval(val):
try:
val = ast.literal_eval(val)
except ValueError:
pass
return val
print [tryeval(x) for x in L]
def tryEval(s):
try:
return eval(s, {}, {})
except:
return s
map(tryEval, ["hello", "3", "3.64", "-1"])
Делайте это только в том случае, если вы доверяете вводимым данным. Также имейте в виду, что он поддерживает не только литералы; арифметические выражения также будут оцениваться.
Если вас действительно интересуют только строки, floats и ints, я предпочитаю более многословный, менее эмоциональный
def interpret_constant(c):
try:
if str(int(c)) == c: return int(c)
except ValueError:
pass
try:
if str(float(c)) == c: return float(c)
except ValueError:
return c
test_list = ["hello", "3", "3.64", "-1"]
typed_list = [interpret_constant(x) for x in test_list]
print typed_list
print [type(x) for x in typed_list]
Без использования оценки:
def convert(val):
constructors = [int, float, str]
for c in constructors:
try:
return c(val)
except ValueError:
pass
Это не совсем ответ, но я хотел указать, насколько это может быть важно, когда у вас есть база данных параметров со схемой ID
, PAR
, VAL
. Например:
ID PAR VAL
001 velocity '123.45'
001 name 'my_name'
001 date '18-dec-1978'
Эта схема подходит, когда вы не знаете, сколько параметров нужно хранить для определенного ID
. Недостатком является то, что все значения в VAL
являются строками и должны быть преобразованы в правильный тип данных по требованию. Это можно сделать, добавив в схему четвертый столбец под названием TYPE
, или использовать любой из предложенных до сих пор подходов.
Хороший вопрос!
PS. Схема базы данных связана с одним из моих предыдущих вопросов.
Вариант красивого решения ryans'а, для пользователей numpy:
def tonum( x ):
""" -> int(x) / float(x) / None / x as is """
if np.isscalar(x): # np.int8 np.float32 ...
# if isinstance( x, (int, long, float) ):
return x
try:
return int( x, 0 ) # 0: "0xhex" too
except ValueError:
try:
return float( x ) # strings nan, inf and -inf too
except ValueError:
if x == "None":
return None
return x
def numsplit( line, sep=None ):
""" line -> [nums or strings ...] """
return map( tonum, line.split( sep )) # sep None: whitespace