如何准备一个包含整数,浮点数和字符串组合的列表?

时间:2017-05-28 15:40:25

标签: python regex string list lambda

说我有数据

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

有什么问题

6 个答案:

答案 0 :(得分:5)

您可以使用嵌套的tryexcept

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]

干杯。