Python 3.6 - взять список различных типов в качестве входных данных - PullRequest
0 голосов
/ 16 октября 2018

Если у меня есть такой ввод: «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 привет4 5.0 ", возможно преобразовать его в список вроде этого: [1, 2, 'hello', 4, 5.0]?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Если вы находитесь в списочном понимании столько, сколько я, вы можете использовать что-то вроде этого (сначала вы должны преобразовать строковый ввод в список с помощью split ()):

a = [int(x) if str(x).isdigit() else float(x) if str(x).replace('.','',1).isdigit() else x for x in a]

0 голосов
/ 16 октября 2018

Я использовал 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]
0 голосов
/ 16 октября 2018

Не без дополнительной работы: вам понадобится ваша собственная функция преобразования, которая обрабатывает различные типы.Что-то вроде (не проверено!):

def convert(s):
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            pass
    return s

list(map(convert, a.split())
...