Как подготовить список, содержащий сочетание целых чисел, чисел с плавающей точкой и строк, используя лямбда-функцию?
Я пытаюсь преобразовать:
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']