Как подготовить список, содержащий сочетание целых чисел, чисел с плавающей точкой и строк, используя лямбда-функцию?

Я пытаюсь преобразовать:

data = 'A|B|2|D|0.3|5|kg|1.69|m'

to list
['A','B',2,'D',0.3,5,'kg',1.69,'m'] 
# where every element is the type it should be (not all are strings)

Я старался:

data_list = da.split('|')
print(da_list)
['A', 'B', '2', 'D', '0.3', '5', 'kg', '1.69', 'm'] # every element is string

#Then

data_list02 = map(lambda x: (int(x) or float(x)) if x.isdigit() else str(x), data_list)
print (data_list02)
['A', 'B', 2, 'D', '0.3', 5, 'kg', '1.69', 'm'] # float are retained as str

Что не так с лямбда-решением, которое я пробовал? Я не пытаюсь написать другое def function

2 ответа

Ты можешь использовать literal_eval от ast Модуль с пользовательским методом, как этот пример:

from ast import literal_eval as le

def format(data, sep= '|'):
    for k in data.split(sep):
        try:
            yield le(k)
        # Or:
        # You can escape any kind of odd data by using:
        # except Exception:
        #     yield k
        # Or list them then yield k
        except ValueError:
            yield k
        # Thanks to @RomanPerekhrest's comment
        except SyntaxError:
            yield k

data = 'A|B|2|D|0.3|5|kg|1.69|m'
final = list(format(data))
print(final)

Выход:

['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']

PS: я не тестировал этот метод на большом количестве данных, оставляйте свои отзывы, если он не удастся с какой-либо.

Ты можешь использовать:

data_List=[int(x) if x.isdigit() else float(x) if x.replace(".", "", 1).isdigit() else str(x) for x in data]

Пример:

>>> data = 'A|B|2|D|0.3|5|kg|1.69|m'
>>> data=data.split('|')
>>> data
['A', 'B', '2', 'D', '0.3', '5', 'kg', '1.69', 'm']
>>> data_List=[int(x) if x.isdigit() else float(x) if x.replace(".", "", 1).isdigit() else str(x) for x in data]
>>> data_List
['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']

РЕДАКТИРОВАТЬ

Если у вас отрицательное целое число или число с плавающей запятой:

data_List=[int(x) if x.lstrip('-').isdigit() else float(x) if x.lstrip('-').replace(".", "", 1).isdigit() else str(x) for x in data]

Пример:

>>> data = 'A|B|2|D|0.3|-5|kg|-1.69|m'
>>> data=data.split('|')
>>> data_List=[int(x) if x.lstrip('-').isdigit() else float(x) if x.lstrip('-').replace(".", "", 1).isdigit() else str(x) for x in data]
>>> data_list
['A', 'B', 2, 'D', 0.3, -5, 'kg', -1.69, 'm']
Другие вопросы по тегам