Почему преобразование целого числа в строку, его нарезка, а затем преобразование обратно в целое число дает мне эту ошибку TypeError? - PullRequest
0 голосов
/ 02 октября 2018

Итак, я пытаюсь решить задачу здесь , и у меня есть базовый алгоритм, написанный для решения этой проблемы.Одна из функций этого алгоритма заключается в том, что он преобразует входные данные функции n в строку, разрезает каждый символ, кроме первого, и преобразует его обратно в целое число, используя следующее: o = int(str(n[:1])).Однако, когда я делаю это, я получаю эту ошибку: TypeError: 'int' object is not subscriptable.Я нашел еще один случай здесь , но, похоже, он не решил мою проблему.Что означает эта ошибка и как я могу избавиться от кода?

Полная функция:

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

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Это так же просто, как просто изменить его на o = int(str(n)[:1])

Надеюсь, это поможет!

0 голосов
/ 02 октября 2018

Вы применяете срез [: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 становится 1 и 24, поскольку потеря этих двух пар равна нулю.Это относится как к int-string-slice-int, так и к арифметическому подходу.Только сохранение n в виде последовательности строковых цифр сохранит эту информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...