преобразование списка Python строк к их типу

учитывая список строк Python, как я могу автоматически преобразовать их в их корректный тип? Значение, если я имею:

["hello", "3", "3.64", "-1"]

Я хотел бы, чтобы это было преобразовано в список

["hello", 3, 3.64, -1]  

где первый элемент является строкой, второе интервал, третье плавание и четвертое интервал.

как я могу сделать это?спасибо.

11
задан 18 May 2010 в 17:47
поделиться

6 ответов

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]
23
ответ дан 3 December 2019 в 02:01
поделиться
def tryEval(s):
  try:
    return eval(s, {}, {})
  except:
    return s

map(tryEval, ["hello", "3", "3.64", "-1"])

Делайте это только в том случае, если вы доверяете вводимым данным. Также имейте в виду, что он поддерживает не только литералы; арифметические выражения также будут оцениваться.

3
ответ дан 3 December 2019 в 02:01
поделиться

Если вас действительно интересуют только строки, 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]
0
ответ дан 3 December 2019 в 02:01
поделиться

Без использования оценки:

def convert(val):
    constructors = [int, float, str]
    for c in constructors:
        try:
            return c(val)
        except ValueError:
            pass
8
ответ дан 3 December 2019 в 02:01
поделиться

Это не совсем ответ, но я хотел указать, насколько это может быть важно, когда у вас есть база данных параметров со схемой ID, PAR, VAL. Например:

ID  PAR      VAL
001 velocity '123.45'
001 name     'my_name'
001 date     '18-dec-1978'

Эта схема подходит, когда вы не знаете, сколько параметров нужно хранить для определенного ID. Недостатком является то, что все значения в VAL являются строками и должны быть преобразованы в правильный тип данных по требованию. Это можно сделать, добавив в схему четвертый столбец под названием TYPE, или использовать любой из предложенных до сих пор подходов.

Хороший вопрос!

PS. Схема базы данных связана с одним из моих предыдущих вопросов.

0
ответ дан 3 December 2019 в 02:01
поделиться

Вариант красивого решения 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
0
ответ дан 3 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: