python int()数字转换问题

python用int()转换出的数字都是1.这样的,既不是1,也不是1.0,而是1.即一个整数加一个小数点的形式,请问这是怎么回事?代码如下:#1002写出这个数impo... python用int()转换出的数字都是1.这样的,既不是1,也不是1.0,而是1. 即一个整数加一个小数点的形式,请问这是怎么回事?代码如下:#1002 写出这个数import math as mimport numpy as npn = eval(input())x = nsum = 0def count(x): count = 0 while x != 0: x = x//10 count = count + 1 return count#注意这里操作完成后x值为0def slice(n,count): #将数字按位正序切割为列表,n是数字,count是位数 list = np.zeros(count) for i in range(count,0,-1): list[count-i] = int(n//m.pow(10,i-1)) n = n % (int(m.pow(10,i-1))) return list for i in range(count(n)): sum = sum + slice(n,count(n))[i]list = slice(sum,count(sum))#测试用例为361时,非常奇怪的是这一步完成后的list中元素都是1. 0. 这样的数字,而不是1 0 也不是1.0 0.0for i in range(count(sum)): list[i] = round(list[i]) list[i] = str(list[i])print(list)for i in range(count(sum)): if list[i] == 0: list[i] = 'ling' elif list[i] == 1: list[i] = 'yi' elif list[i] == 2: list[i] = 'er' elif list[i] == 3: list[i] = 'san' elif list[i] == 4: list[i] = 'si' elif list[i] == 5: list[i] = 'wu' elif list[i] == 6: list[i] = 'liu' elif list[i] == 7: list[i] = 'qi' elif list[i] == 8: list[i] = 'ba' elif list[i] == 9: list[i] = 'jiu'print(list) 展开
 我来答
liyuanji1002
2018-08-12 · TA获得超过130个赞
知道答主
回答量:56
采纳率:95%
帮助的人:37.9万
展开全部

这个问题的原因是你用的np.zeros(count),它的默认数据类型是float类型的,而且不管你往这个np列表传入什么类型的值,它都是自动改为float类型。注意这个float类型可不是原生的浮点类型, 虽然“看”起来差不多, 但如果用type函数的话就能看出来区别了。 

有两种解决方法可以解决你的问题。

  1. list = np.zeros(count)   改为  list = np.zeros(count,dtype=int)。 这样就不会出现你所说的问题, 但对于你的这段程序用numpy有点大材小用了。 建议你用下面的方法。

  2. list = np.zeros(count)   改为  list = [0 for i in range(count)]

然后第二张图的错误提示正是因为numpy试图把字符串自动转换为浮点数,但显然是不可能的。为了避免这个错误就必要用我上面的第二个解决方法才行了。 

最后,你的代码有可优化的空间,太多遍历和判断条件了。可能会很长,但可能会对你有一些启发,如果没有耐心的话,可以看最后一条就是最终完成的代码。

  1. slice函数处理逻辑过于复杂了。 你是想把如361变成[3,6,1]这样的情况吧。那为何不使用list(str(361))呢,虽然最后的结果里面的元素是字符串类型,但后面直接用int(i)的方式解决了。这样的话,count函数都可以省略了。

  2. 看到slice函数下面的for遍历语句,我明白了你的用意,就是为了计算各个位数相加的和,这样的话,就连slice函数都没必要了。直接下面代码就可以了:

for i in str(n):
    sum += int(i)

3.再继续,发现又是slice和for循环,原来是要继续把sum分开。直接list(str(sum))即可。

4.到最后了,我看到了很多条件判断,总觉得条件判断这么写,显得有点罗嗦了点。可以把你这个条件判断写一个类似配置文件的对象,其实就是字典对象。 最终给你总结一下你的代码就是下面这样的:

#input直接用字符串类型就够用了。然后去掉所有import
inputStr = input()
sum = 0
#这条赋值语句其实无所谓, 但对于理解代码来说还是很重要的,反正也不影响性能,何乐而不为呢。
result = []

#下面的是类似配置文件的字典对象
convertDic = {'1':'yi','2':'er','3':'san','4':'si','5':'wu','6':'liu','7':'qi','8':'ba','9':'jiu','0':'ling'}

#算出input的各个位相加的和
for i in inputStr:
    sum += int(i)

#str也是可迭代的类型,所以通过map和lambda匿名函数把各个值变成相对应的拼音。
result = list(map(lambda x:convertDic[x], str(sum)))
print(result)

#去掉注释和print语句,这段程序只用了7行,而且理解起来是不是还挺简单的(除了最后一条)
#我相信你对于上面的语句不是很懂,里面涉及了两个看起来“高达上的东西”,但其实就是一种简写形式。
#map就是映射,简单说就是一个循环,就是把每一个元素经过一个函数处理后再返回来的过程。
#lambda是一个匿名函数,没有函数名,只能有一个表达式,且这个表达式就是返回值。它就是一个精简版的函数而已。当然,map里面也可以直接写已定义好的函数名。
#最后我用比较通俗的代码给你解释一下上面那句语句的大致的工作流程

#定义一个函数,相当于上面的匿名函数.
def convert(x):
    return convertDic[x]
#然后遍历sum,并把每个元素替换成相应的拼音。现在的sum是一个int类型,int类型是不能迭代的或者遍历的,所以需要把int转换成str类型。
#这里讲一点map和这个循环遍历的区别,首先map会把已有的元素替换成经过函数处理的值。但这条循环是在一个空的list对象里添加数据,这是区别。当然,也可以写替换数据的循环,但代码量不是这2行了,会更多。如果要遍历的话,这种写法还是比较推荐的。
for i in str(sum):
    result.append(convert(i))
    #result.append(convertDic[x]) 也可以这样写,但为了解释上面那条语句,所以这条注释掉当给你的启发。
#最后print就可以看到结果了,也就是说,我们把4条一句压缩成了一天语句了。如果还是不了解的话,可以翻翻文档什么的,里面会有一些例子可当参考。
print(result)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式