大家好鸭,我是小熊猫🖤

今天遇见这样一个问题:

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掉了,测试如下:

python数字取整数 python中从整数中提取数字_Python

首先构建了两个list,里面分别有100万个整数和100万个浮点数,组合起来之后进行shuffle打乱顺序。

下面进行第一种方式测试,使用最传统的迭代对比

python数字取整数 python中从整数中提取数字_浮点数_02

可以看见,对200万个对象进行迭代对比,平均耗时为366ms,效率还行。

既然我们用的Python,自然要去试一下Python特色的写法,比如表推导式

python数字取整数 python中从整数中提取数字_浮点数_03

使用Python特有的语法表推导式,效率比直接for循环要快一点点,不过经过我后续测试,是因为因为for会连续调用append的耗时(这点效率就忽略不记了)。

下面进入正式的Python特色环节——调包,我们来使用Python里面最强大的数值包numpy来实现:

python数字取整数 python中从整数中提取数字_迭代_04

方法如下:

python数字取整数 python中从整数中提取数字_Python_05

从300多毫秒,一下就提升到了

16毫秒

……20多倍的提升,果然不亏是Python第一神包之称。

从上面的代码看,非常简单,首先把整个list里面的对象全部换为整数,然后用转换后的数值和原来数值进行对比,如果不一样,则是浮点数。

不过这种功能有一个小问题,就是7这种整数数,如果和7.0放在一起,就会直接被换为float型(numpy的矩阵会统一类型),然后转换回整数,也就得到的全部都是整数了:

python数字取整数 python中从整数中提取数字_Python_06

不过从

数学上来说

……好像也没有毛病,7.0本来就是整数,但是从计算机角度来说,int和float的存储字段是不一样的,如下所示,0.0和整数对比,得到的False

python数字取整数 python中从整数中提取数字_浮点数_07

所以使用场合,就看你是用于数学计算,还是对象对比了,

在不同的场合,需要选用不同的方法来实现。