Как преобразовать строку в список / кортеж без потери типа значений в строке?

#python #python-3.x

#python #python-3.x

Вопрос:

Если у меня есть

 a = "3.14, ABCF , 2.16"
  

и тип (a) возвращает «str»

как я могу преобразовать это в список или кортеж и сохранить целостность типов элементов внутри. (например: запуск через коллекцию и тип проверки должен возвращать float, string, float соответственно)

Комментарии:

1. Какой тип целостности? Все, что у вас есть, это string здесь нет других типов

2. Ах, спасибо, это то, о чем у меня возник вопрос. Смогу ли я сделать что-то вроде «{0}, {1}, {2}». вместо этого формат (3.14,»ABCF», 2.16) ? или есть какой-либо другой способ, которым я мог бы это сделать?

3. Это создает string с заданными значениями. Я не уверен, чего вы пытаетесь здесь достичь. Строка — это строка, у нее нет других типов

4. Спасибо, я думаю, вы ответили на мой вопрос. Похоже, у меня ошибка в понимании!

Ответ №1:

Я сделал это, используя регулярное выражение

 import re
a = "3.14, ABCF , 2.16 , 9"
b=a.split(",")  #break string
for c in b:
    x=c.strip() # removes whitespace character
    if x.isdigit(): #return bool value
        print("int")
    elif bool(re.search('[a-zA-Z] ', x)):
        print("string")
    elif bool(re.search('[0-9.] ', x)):
        print("float")
  

ВЫВОД :

 float
string
float
int
  

или

С помощью библиотеки python ast

 from ast import literal_eval

def get_type(data):
    try:
        return type(literal_eval(data))
    except (ValueError, SyntaxError):
        # A string, so return str
        return str

a = "3.14, ABCF , 2.16 , 9, True"
b=a.split(",")
for c in b:
    x=c.strip()
    print(get_type(x))
  

ВЫВОД:

 <class 'float'>
<class 'str'>
<class 'float'>
<class 'int'>
<class 'bool'>
  

Комментарии:

1. Почему вы приводите x.isdigit() к bool ? Это уже возвращается. Кроме того, регулярные выражения на самом деле не гарантируют какой-либо безопасности типов, вы просто предполагаете, что строки, соответствующие этой схеме, имеют этот тип

2. Спасибо @UnholySheep, я обновил предыдущий код и добавил другой тип примера, чтобы сделать то же самое.