Python c[i] = int(n1[i]) + int(n2[i]) + d TypeError: 'reversed' object is not subscriptable

Рейтинг: 0Ответов: 1Опубликовано: 24.03.2023

Мне нужно реализовать алгоритм сложения длинных чисел на Python. Тут совсем новичок и не понимаю некоторых особенностей. Я получаю ошибку:

c[i] = int(n1[i]) + int(n2[i]) + d
TypeError: 'reversed' object is not subscriptable

Почему к перевернутой строке нельзя обращаться по индексу? Сам код:

number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')
l = max(len(number1), len(number2))
n1 = reversed(number1)
n2 = reversed(number2)
d = 0
c = ''
for i in range(0, l, 1):
    c[i] = int(n1[i]) + int(n2[i]) + d
    if c[i] > 9:
        c[i]-=10
        d = 1
    else:
        d = 0
print(reversed(c))

Новый код:

def rev(line):
    line = list(line)
    l = len(line) - 1
    for i in range(0, l // 2, 1):
        tmp = line[i]
        line[i] = line[l - i]
        line[l - i] = tmp
    s = ''.join(line)
    return s


number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')
l = max(len(number1), len(number2))
number1 = rev(number1)
number2 = rev(number2)
if len(number2) < l:
    while len(number2) != l:
        number2+='0'
print(number1)
print(number2)
d = 0
c = ''
for i in range(l):
    s = 0
    s = int(number1[i]) + int(number2[i]) + d
    if s > 9:
        s -= 10
        d = 1
    else:
        d = 0
    c += str(s)  # 3
if d > 0:  # 4
    c += str(d)
print(c[::-1])

Ответы

▲ 0Принят
  1. reversed не переворачивает строку. Он только возвращает специальный объект с помощью которого символы строки можно перебрать в обратном направлении. Перевернуть строку можно так: number1[::-1].

  2. Если строки разной длины будет обращение за пределы короткой строки. Их нужно подравнять.

  3. Строку c лучше заменить на список. Быстрее будет работать.

  4. Забыт последний перенос. Например 50 + 50-> 00.

Всё остальное работает как нужно:

number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')
l = max(len(number1), len(number2))
n1 = number1[::-1] + '0' * (l - len(number1))    # 1 и 2
n2 = number2[::-1] + '0' * (l - len(number2))
d = 0
c = []                                           # 3
for i in range(l):
    s = int(n1[i]) + int(n2[i]) + d
    if s > 9:
        s -= 10
        d = 1
    else:
        d = 0
    c.append(s)                                  # 3
if d > 0:                                        # 4
    c.append(d)
print(''.join(map(str, reversed(c))))            # 3

P.S. Более питоновский код. Вместо переворота строк они итерируются задом-наперед:

import itertools


number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')

carry = 0
c = []
for d1, d2 in itertools.zip_longest(
    reversed(number1),
    reversed(number2),
    fillvalue='0'
):
    carry, d = divmod(int(d1) + int(d2) + carry, 10)
    c.append(d)
if carry > 0:
    c.append(carry)

print(''.join(map(str, reversed(c))))