从错误中学python(2)————字符串转浮点数
题目
自己编写函数:利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456:
题目来源——致敬廖雪峰
解决过程
初步的解决方法
def str2float(s):
def char2num(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
#这事实上是一个字典
index_point=s.find('.')
if index_point==-1:
daichu=1
else:
daichu=0.1**(len(s)-1-index_point)
s=s[0:index_point]+s[index_point+1:]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(char2num,s))
return result1*daichu
这里用到字符串的find()函数进行模式匹配。
这个看起来是没有问题的可是python3.0里面0.1的三次方是:
>>> 0.1**3
0.0010000000000000002
所以这样不行,那么我们就是用除法
改用除法
def str2float(s):
def char2num(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
#这事实上是一个字典
index_point=s.find('.')
if index_point==-1:
daichu=1
else:
daichu=10**(len(s)-1-index_point)
s=s[0:index_point]+s[index_point+1:]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(char2num,s))
return result1/daichu
这样就能得到正确的结果了。
可是这里我们使用find()函数还要用切片生成新的字符串,这里能够用split()函数
def str2float(s):
def char2num(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
#这事实上是一个字典
strs,index_point=s.split('.'),len(s.split('.')[1])
daichu=10**index_point
s=strs[0]+strs[1]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(char2num,s))
return result1/daichu
这里的char2num事实上是全然不必要定义的,由于已经有int(str)这样的构造函数了
改用int函数
def str2float(s):
strs,index_point=s.split('.'),len(s.split('.')[1])
daichu=10**index_point
s=strs[0]+strs[1]#这里是除去小数点
from functools import reduce
result1=reduce(lambda x,y:x*10+y,map(int,s))
return result1/daichu
当然我们也能够把小数部分倒着计算,这样代码会更简短。花更短的时间思考就能写更短的代码
小数部分倒着算
from functools import reduce
def str2float(s):
a = s.split('.')
return reduce(lambda x, y: x*10+y, map(int, a[0]))\
+ reduce(lambda x, y: x/10+y, map(int, a[1][::-1])) / 10
a[1][::-1])这种方法非常巧妙。能够用于把字符串倒序输出。比如
a[::-1]
也就是设置步长为1从右往左取,第二个參数表示右边開始取的位置,第一个參数表示第一个不用取的位置。
从错误中学python(2)————字符串转浮点数的更多相关文章
- 从错误中学python(4)——最小公约数与辗转相除法
题目 给你两个正整数a和b, 输出它们的最大公约数 辗转相除法 辗转相除法的步骤 def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd( ...
- Python 把字符串变成浮点数
from functools import reducedi = {}di.update(zip('1234567890.', [1,2,3,4,5,6,7,8,9,0,'.'])) def str2 ...
- Python:字符串
一.序列的概念 序列是容器类型,顾名思义,可以想象,“成员”们站成了有序的队列,我们从0开始进行对每个成员进行标记,0,1,2,3,...,这样,便可以通过下标访问序列的一个或几个成员,就像C语言中的 ...
- Python的字符串和编码
1. 字符编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit) ...
- Python格式化字符串~转
Python格式化字符串 在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作 ...
- Python格式化字符串和转义字符
地址:http://blog.chinaunix.net/uid-20794157-id-3038417.html Python格式化字符串的替代符以及含义 符 号 说 明 ...
- Python基础-字符串格式化_百分号方式_format方式
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- python判断字符串
python判断字符串 s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小 ...
- Python格式化字符串
在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的pr ...
随机推荐
- 【BZOJ 3534】 3534: [Sdoi2014]重建 (Matrix-Tree Theorem)
3534: [Sdoi2014]重建 Time Limit: 10 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 709 Solved: 32 ...
- 加密url
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 可以采用 https 证书 双向 加密验证. 加密到 JNI 里面,还是可以通过抓包工具 ...
- [SDOI2017]数字表格 --- 套路反演
[SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...
- 【tarjan+拓扑】BZOJ3887-[Usaco2015 Jan]Grass Cownoisseur
[题目大意] 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) [思路] 首先 ...
- bzoj 2693
收获: 1.积性函数的积也是积性函数,基本的积性函数:常数函数,正比例函数,欧拉函数,Mobius函数,积性函数一般都知道表达式,所以一般都可以在线性筛时搞定. 2.遇到整除求和时,这个东西就已经是最 ...
- 再见了,DM
在DM奋斗了20个月之后,我终于有机会DM说再见.这我不是我第一次和DM说再见,因此我也不确定这次的再见是再也不见,还是再次见面.但有一点可以确定的是,在接下来相当长的一段时间内,我是没有机会 ...
- rsync进行不同服务器之间的数据同步
2台服务器上都要安装rsync,sudo yum install rsync. 把远程的数据备份到本机: rsync -rP --rsh=ssh root@IP:/data/tmp /data/tmp ...
- Shell编程(脚本)的经常使用命令和语句
一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...
- Delphi第三方组件安装DCU.PAS.DPK.BPL.ActiveX控件
不是由BORLAND提供的组件叫第三方组件:安装方法:南山古桃(nsgtao)首先提醒一下:最好把要安装的文件先复制到Delphi安装目录的Lib目录下再执行下面的操作!就目前常见的各种形式的组件的安 ...
- Hadoo生态中pHive HBase 项目的区别
http://jenmhdn.iteye.com/blog/1678789 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于H ...