说我有数据
data = 'A|B|2|D|0.3|5|kg|1.69|m'
我想使用split('|')将其转换为列表,但是我得到了所有值都转换为字符串的列表。我没有在SE上看到任何类似的问题。
我如何得到类似的内容:
data_list = ['A','B',2,'D',0.3,5,'kg',1.69,'m']
其中数据的类型是(int,str或float)。
我不想要一个非常冗长的功能,但是这是一种最短最简单的方法,lambda是可能的(我正在尝试但到目前为止没有成功)?,否则其他一切也很好。
任何想法。
发布编辑:
我尝试以下列方式使用lambda:
da_list02 = map(lambda x: float(x) if type(float(x)) is float else str(x), da_list)
但是,我得到了ValueError
。
ValueError:无法将字符串转换为float:A
else
的{{1}}部分不应该覆盖它吗? lambda function
答案 0 :(得分:5)
您可以使用嵌套的try
和except
def convert(value):
try:
return int(value)
except ValueError:
try:
return float(value)
except ValueError:
return value
data = 'A|B|2|D|0.3|5|kg|1.69|m'
data_list = [convert(value) for value in data.split('|')]
print(data_list)
答案 1 :(得分:1)
您可以尝试将字符串转换为float。
data = 'A|B|2|D|0.3|5|kg|1.69|m'
def transform(x):
try:
return float(x)
except ValueError:
return x
[transform(x) for x in data.split('|')]
输出:
['A', 'B', 2.0, 'D', 0.3, 5.0, 'kg', 1.69, 'm']
答案 2 :(得分:1)
你可以试试这个:
print [i if i[0] in string.ascii_lowercase or i[0] in string.ascii_uppercase else int(i) if i.isdigit() else float(i) for i in new_data]
另外,如果你想要一个简单的列表理解,你可以使用它:
{{1}}
答案 3 :(得分:1)
另一种方法是使用正则表达式。对不起,我使用了一个功能。
import re
data = 'A|B|2|D|0.3|5|kg|1.69|m'
data_list = data.split('|')
print('data_list: ', data_list)
def parse(item):
if re.search("\d+\.\d+", item):
return float(item)
elif re.search("\d+", item):
return int(item)
else:
return str(item)
result = [parse(item) for item in data_list]
print('result: ', result)
for item in result:
print('{}, type: {}'.format(item, type(item)))
答案 4 :(得分:1)
这是我的解决方案,使用带有锚点和map()
的正则表达式:
import re
data = 'A|B|2|D|0.3|5|kg|1.69|m'
def convert(item):
if re.match(r'-?\d+$', item):
return int(item)
elif re.match(r'-?\d+\.\d+$', item):
return float(item)
else:
return item
elements = map(convert, data.split('|'))
print(elements)
# ['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']
答案 5 :(得分:0)
Lambda不适合这种情况,因为它们仅限于一个衬垫。在这种情况下,您需要一些条件。
你可以有一个短的效用函数,它接受一个字符串,推断出类型并返回不同类型。这个解决方案适用于整数,浮点数和字符串。
def set_type(s):
"""(str)->infered type.
Takes a string, inferes the type and returns either a string, int or float.
"""
if s.isnumeric():
return int(s)
if s.count(".") == 1 and "".join([c for c in s if c!="."]).isnumeric():
return float(s)
return s
现在可以在列表中映射函数:
>>> data = 'A|B|2|D|0.3|5|kg|1.69|m'
>>> lst = lst = data.split("|")
>>> list(map(set_type, lst))
['A', 'B', 2, 'D', 0.3, 5, 'kg', 1.69, 'm']
>>> data_list = list(map(set_type, lst))
>>> list(map(type, data_list))
[str, str, int, str, float, int, str, float, str]
干杯。