请原谅我,我是Python的新手。
给定一个以不确定长度的浮点开始并以相同结尾的字符串,如何将它们提取到一个数组中,或者如果只有一个浮点数,只需要一个。
示例:
"38.00,SALE ,15.20"
"69.99"
我想回来:
[38.00, 15.20]
[69.99]
答案 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]
说明:
list_to_filter = input.split(",")
,
拆分
filtered_list = filter(<lambda>, list_to_filter)
,如果lamda表达式为true,则此项包含在过滤器的输出中。因此,当re.match("\s*\d+.?\d+\s*", x)
匹配字符串x
时,过滤器会保留它。 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()]