Python 3.6 - взять список различных типов в качестве входных данных

1

Если у меня есть вход вроде "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]?

  • 1
    Не без дополнительной работы по преобразованию чисел в целые числа и числа с плавающей точкой. Или используя eval, от которого люди, как правило, избегают (поскольку он может принести больше вреда, чем пользы).
  • 1
    @ 9769953 Это хороший совет относительно eval , но поскольку это просто строка, представляющая действительные литералы Python, ее можно оценить с помощью ast.literal_eval , у которой нет проблем с безопасностью простого eval .
Теги:
list
input

3 ответа

4
Лучший ответ

Для этого я использовал 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]
3

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

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

list(map(convert, a.split())
  • 0
    К вашему сведению, вам не хватает закрывающей скобки в последней строке :-)
  • 0
    Есть ли причина, по которой вы передаете последнюю ошибку, а не возвращаете s ?
Показать ещё 5 комментариев
0

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

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

  • 0
    if str(x).replace('.','',1).isdigit() - плохая идея, если строки с плавающей запятой содержат показатель степени: "1e50" или "1.23E123".
  • 0
    А как насчет отрицательных чисел?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню