Python:从字符串中提取多个浮点数

时间:2016-10-15 03:47:19

标签: python string

请原谅我,我是Python的新手。

给定一个以不确定长度的浮点开始并以相同结尾的字符串,如何将它们提取到一个数组中,或者如果只有一个浮点数,只需要一个。

示例:

"38.00,SALE ,15.20"
"69.99"

我想回来:

[38.00, 15.20]
[69.99]

7 个答案:

答案 0 :(得分:3)

您也可以使用正则表达式执行此操作

import re
s = "38.00,SALE ,15.20"
p = re.compile(r'\d+\.\d+')  # Compile a pattern to capture float values
floats = [float(i) for i in p.findall(s)]  # Convert strings to float
print floats

输出:

[38.0, 15.2]

答案 1 :(得分:2)

def extract_nums(text):
    for item in text.split(','):
        try:
            yield float(item)
        except ValueError:
            pass

print list(extract_nums("38.00,SALE ,15.20"))
print list(extract_nums("69.99"))
[38.0, 15.2]
[69.99]

但是,使用float转换时,您losing precision,如果您想保持精度,可以使用decimal

import decimal

def extract_nums(text):
    for item in text.split(','):
        try:
            yield decimal.Decimal(item)
        except decimal.InvalidOperation:
            pass

print list(extract_nums("38.00,SALE ,15.20"))
print list(extract_nums("69.99"))
[Decimal('38.00'), Decimal('15.20')]
[Decimal('69.99')]

答案 2 :(得分:1)

你说你只对字符串开头和结尾的浮点数感兴趣,所以假设它以逗号分隔:

items = the_string.split(',')
try:
    first = float(items[0])
except (ValueError, IndexError):
    pass
try:
    second = float(items[-1])
except (ValueError, IndexError):
    pass

我们必须将操作包装在异常处理程序中,因为该值可能不是有效的float(ValueError),或者list中可能不存在索引(IndexError)。

这将处理所有情况,包括是否省略了一个或两个浮点数。

答案 3 :(得分:0)

您可以尝试类似

的内容
the_string = "38.00,SALE ,15.20"
floats = []
for possible_float in the_string.split(','):
    try:
        floats.append (float (possible_float.strip())
    except:
        pass
print floats

答案 4 :(得分:0)

尝试列表理解:

just_floats = [i for i in your_list.split(',') if i.count('.') == 1]

首先将字符串拆分为逗号所在的字符串,然后筛选字符串并删除不具有小数位的值

答案 5 :(得分:0)

import re    
map(float, filter(lambda x: re.match("\s*\d+.?\d+\s*", x) , input.split(","))

输入:input = '38.00,SALE ,15.20'输出:[38.0, 15.2]

输入:input = '38.00,SALE ,15.20, 15, 34.'输出:[38.0, 15.2, 15.0, 34.0]

说明:

  1. 想法是在list_to_filter = input.split(",")
  2. 上拆分字符串:,拆分
  3. 然后使用实数的正则表达式过滤字符串:filtered_list = filter(<lambda>, list_to_filter),如果lamda表达式为true,则此项包含在过滤器的输出中。因此,当re.match("\s*\d+.?\d+\s*", x)匹配字符串x时,过滤器会保留它。
  4. 最后转换成浮动。 map(float, filtered_list)。它的作用是将float()函数应用于列表的每个元素

答案 6 :(得分:0)

拆分输入,检查每个元素在删除句点时是否为数字,如果是,则转换为float。

def to_float(input):
    return [float(x) for x in input.split(",") if unicode(x).replace(".", "").isdecimal()]