Python如何优雅将含乘数的数值字符串转换为浮点数列表
字符串转带重复规则的浮点数列表实现
需求背景
需要将如下字符串转换为浮点数列表:
strng= "0.000000000000000E+000, 2*2.400000000000000E-002 , 97*0.000000000000000E+000 ,"
用strng.split(',')拆分后得到的初始结果为:
[' 0.000000000000000E+000', ' 2*2.400000000000000E-002 ', ' 97*0.000000000000000E+000 ', '\n']
转换规则:
- 空值、换行符直接过滤
- 含
*的元素:*前的数字为重复次数,*后的数值需要重复对应次数添加到列表 - 不含
*的元素:直接转换为浮点数添加到列表
原代码问题
你给出的初始代码存在几个问题:
strng.split("=").split(',')语法错误,split返回列表,无法直接链式调用split- 未处理元素首尾的空白字符
- 未过滤空元素和换行符
- 重复逻辑错误:
int(i[0])*i[1]是字符串乘法,不会生成多个独立浮点数元素 - 未做浮点数类型转换
优化实现
基础易读版
逻辑清晰,适合大多数场景:
strng = "0.000000000000000E+000, 2*2.400000000000000E-002 , 97*0.000000000000000E+000 ," res = [] # 拆分后去除每个元素的首尾空白 for part in map(str.strip, strng.split(',')): # 跳过空串和换行符 if not part: continue if '*' in part: cnt, val = part.split('*') # 重复对应次数的浮点数加入列表 res.extend([float(val)] * int(cnt)) else: res.append(float(part))
简洁性能版
使用itertools.repeat减少内存占用,适合重复次数极大的场景:
from itertools import repeat strng = "0.000000000000000E+000, 2*2.400000000000000E-002 , 97*0.000000000000000E+000 ," res = [] for part in filter(None, map(str.strip, strng.split(','))): cnt, _, val = part.rpartition('*') res.extend(repeat(float(val), int(cnt))) if cnt else res.append(float(val))
结果验证
最终生成的列表总长度为1+2+97=100,前3个元素为[0.0, 0.024, 0.024],后续97个元素均为0.0,完全符合转换要求。
内容的提问来源于stack exchange,提问作者wander95
相关产品推荐
相关产品推荐

