Если у меня есть вход вроде "1 2 3 4 5", я могу преобразовать его в список int, как показано ниже:
a = input("List: ") #"1 2 3 4 5"
a = list(map(int, a.split())
print(a) #[1, 2, 3, 4, 5]
В случае, если у нас есть вход вроде "1 2 hello 4 5.0", его можно преобразовать в список следующим образом: [1, 2, 'hello', 4, 5.0]
?
Для этого я использовал ast.literal_eval
. Согласно документу literal_eval.
Он безопасно оценивает узел выражения или кодировку Unicode или Latin-1, содержащую литеральный или контейнерный дисплей Python.
import ast
a="1 2 hello 4 5.0"
def converter(l):
try:
return ast.literal_eval(l)
except ValueError:
return l
print(list(map(converter,a.split())))
ВХОД
1 2 hello 4 5.0
ВЫХОД
[1, 2, 'hello', 4, 5.0]
ВХОД
-123 123E123
ВЫХОД
[-123, 1.23e+125]
Не без дополнительной работы: вам понадобится ваша собственная функция преобразования, которая обрабатывает различные типы. Что-то вроде (непроверено!):
def convert(s):
try:
return int(s)
except ValueError:
try:
return float(s)
except ValueError:
pass
return s
list(map(convert, a.split())
s
?
Если вы входите в список, насколько мне известно, вы можете использовать что-то вроде этого (сначала вы должны преобразовать ввод строки в список с помощью split()):
a = [int(x) if str(x).isdigit() else float(x) if str(x).replace('.','',1).isdigit() else x for x in a]
if str(x).replace('.','',1).isdigit()
- плохая идея, если строки с плавающей запятой содержат показатель степени: "1e50" или "1.23E123".
eval
, но поскольку это просто строка, представляющая действительные литералы Python, ее можно оценить с помощьюast.literal_eval
, у которой нет проблем с безопасностью простогоeval
.