大家好鸭,我是小熊猫🖤
今天遇见这样一个问题:
Python怎么从一堆数字里取其中的整数?
比如有1.2, 5.9, .7.4, 6 这几个数,怎么把里面的整数取出来
如果你经常用Python的话,肯定能举出起码五六种方法来解决这问题(不考虑效率的话),例如:
◾转字符之后,用正则表达式
◾判断是否有小数点
◾字符转换回整数是否触发异常
◾使用isinstance或者type方式进行类型对比
……
但是核心一点,就是大家通常都会用迭代来继续对比,例如:
Python的迭代:
for num in [1,1.1,2.0,3,4,0.6]:
if isinstance(num,int):
res.append(num)
那么既然今天说的是一种高效的方法,那么那些所谓的转换来转换去的,肯定第一时间就直接pass掉了,测试如下:
首先构建了两个list,里面分别有100万个整数和100万个浮点数,组合起来之后进行shuffle打乱顺序。
下面进行第一种方式测试,使用最传统的迭代对比:
可以看见,对200万个对象进行迭代对比,平均耗时为366ms,效率还行。
既然我们用的Python,自然要去试一下Python特色的写法,比如链表推导式:
使用Python特有的语法链表推导式,效率比直接for循环要快一点点,不过经过我后续测试,是因为因为for会连续调用append的耗时(这点效率就忽略不记了)。
下面进入正式的Python特色环节——调包,我们来使用Python里面最强大的数值包numpy来实现:
方法如下:
从300多毫秒,一下就提升到了
16毫秒
……20多倍的提升,果然不亏是Python第一神包之称。
从上面的代码看,非常简单,首先把整个list里面的对象全部转换为整数,然后用转换后的数值和原来数值进行对比,如果不一样,则是浮点数。
不过这种功能有一个小问题,就是7这种整数数,如果和7.0放在一起,就会直接被转换为float型(numpy的矩阵会统一类型),然后转换回整数,也就得到的全部都是整数了:
不过从
数学上来说
……好像也没有毛病,7.0本来就是整数,但是从计算机角度来说,int和float的存储字段是不一样的,如下所示,0.0和整数对比,得到的False
所以使用场合,就看你是用于数学计算,还是对象对比了,