【问题标题】:Why does converting an integer to a string, slicing it, and then converting it back to an integer give me this TypeError?为什么将整数转换为字符串,对其进行切片,然后将其转换回整数会给我这个 TypeError?
【发布时间】:2018-10-01 23:30:36
【问题描述】:

所以我正在尝试解决一个挑战here,并且我编写了一个基本算法来解决这个问题。该算法的功能之一是将函数的输入 n 转换为字符串,对除第一个字符之外的每个字符进行切片,然后使用以下命令将其转换回整数:o = int(str(n[:1]))。但是,当我这样做时,它给了我这个错误:TypeError: 'int' object is not subscriptable。我找到了另一个案例here,但它似乎并没有解决我的问题。这个错误是什么意思,我怎样才能摆脱我的代码?

全功能:

def utopianTree(n):
    o = int(str(n[:1]))
    n = int(str(n[1:]))

    for i in range(1, n):
        if n == 0:
            o += 1
        elif i % 2 == 0:
            o *= 2
        elif i % 2 != 0:
            o += 1
        i += 1
    return o

【问题讨论】:

  • n 不是整数吗?如果是这样,Python 是对的,您不能n 上使用下标运算符。也许您的意思是先将n 转换为字符串?
  • n 是一个整数,你不能对整数进行切片,因为它们不是序列。
  • 你的英语说“convert, slice, convert”,但你的代码说“slice, convert, convert”。
  • 你的意思是int(str(n)[:1])
  • 你为什么要进行字符串操作?除了读取输入之外,这个问题完全涉及整数。

标签: python algorithm compiler-errors runtime-error


【解决方案1】:

您将[:1] 切片应用于n,它是一个整数。您不能对整数进行切片,因为它们不是序列。

您的标题表明您要转换为字符串,然后切片,然后再转换回整数,但实际上您并没有这样做。将切片操作放在str() 结果上:

o = int(str(n)[:1])
n = int(str(n)[1:])

分配给o 的第一个数字是最高位,因此您可以反复除以 10,直到该数字小于 10:

o = n
while o > 10:
    o //= 10

或者你可以取值的 log10,这样你就知道用 10 的多少次方来移动这个值;您可以使用相同的幅度值获得n 的剩余数字:

import math

magnitude = int(math.log10(n))
o = n // (10 ** magnitude)
n -= o * (10 ** magnitude)

演示:

>>> import math
>>> n = 4213
>>> magnitude = int(math.log10(n))
>>> o = n // (10 ** magnitude)
>>> n -= o * (10 ** magnitude)
>>> o, n
(4, 213)

考虑到值中的任何零都不会被保留; 1024 变为 124,这两对之间的零已经丢失。这适用于 int-string-slice-int 和算术方法。只有将n 保留为一系列字符串数字才能保留该信息。

【讨论】:

  • 语法纳粹 ;-) +1
  • 哦,我明白了。看来我只是把它们弄乱了,谢谢!
  • @ChristianDean:对不起,我痴迷地编辑和扩展我的答案一段时间,所以发生了冲突。
【解决方案2】:

只要改成o = int(str(n)[:1])就这么简单

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2023-02-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多