Попарное сложение чисел в списке
Даны два списка чисел: [5, 2, 4] и [2, 4, 7] Требуется сложить их между собой так, чтобы на выходе получилось трехзначное число в виде такого же списка -> [7, 7, 1] Так как 524 + 247 = 771
Я пытаюсь сделать что-то вроде такого, но не получается:
def add_list(a, b):
for i in range(len(a)):
if (a[i]+b[i]) > 9:
s.append((a[i] + b[i]) - 10)
s.append((a[i-1] + b[i-1]) + 1)
else:
s.append(a[i] + b[i])
return s
a = [5, 2, 4]
b = [2, 4, 7]
add_list(a, b)
Нужно учитывать, что при если при сложении чисел получается больше 9, то в этой ячейке нужно оставить единицы, а десятки перенести на ячейку влево, при этом, если такая ситуация возникнет при сложении двух первых чисел списков, то переносить не нужно. Помогите с кодом, пожалуйста.
Ответы (5 шт):
Можно так:
lst1 = [5, 2, 4]
lst2 = [2, 4, 7]
res = 0
for i in reversed(range(len(lst1))):
res += (lst1[i]+lst2[i])*10**(len(lst1)-i-1)
res = list(str(res)[::-1][:len(lst1)])
print(res)
Чтобы каждый раз не считать 10**n заново:
lst1 = [5, 2, 4]
lst2 = [2, 4, 7]
res = 0
mult = 1
for i in reversed(range(len(lst1))):
res += (lst1[i]+lst2[i])*mult
mult *= 10
res = list(str(res)[::-1][:len(lst1)])
print(res)
Ещё как вариант:
- переворачиваем оба списка
- перебираем их параллельно
- складываем два числа и предыдущий перенос избытка, если он есть
- остаток по модулю 10 добавляем в выходной список
- избыток переносим в следующий разряд
- в конце обрабатываем случай, когда переполняется самый старший разряд
def add_list(a, b):
s = []
i = 0
for a, b in zip(*map(reversed, (a, b))):
z = a + b + i
s.append(z % 10)
i = z // 10
if i:
s.append(i)
return s[::-1]
a = [5, 2, 4]
b = [2, 4, 7]
print(add_list(a, b))
Вывод:
[7, 7, 1]
Случай, когда списки разного размера, не обрабатывается, но переделать не сложно через itertools.zip_longest.
Циферка к циферке - получается число! Осталось просуммировать :)
Длины списков не влияют на результат.
list_1 = [5, 2, 4, 5]
list_2 = [9, 4, 7]
value_1 = int(''.join(str(val) for val in list_1))
value_2 = int(''.join(str(val) for val in list_2))
temp = value_1 + value_2
result = list(str(temp))
print(result)
Получить нужный фрагмент можно с помощью среза:
result = list(str(temp)[-3:])
можно еще попробовать рекурсию:
a = [5, 2, 4]
b = [2, 4, 7]
f = lambda x,y=1: x[-1]*y + f(x[:-1],y*10) if x else 0
r = lambda x: r(x//10)+[x%10] if x>9 else [x]
r(f(a)+f(b)) # [7, 7, 1]
f - рекурсивно конвертируем список в число
r - рекурсивно конвертируем число в список
a = [5, 2, 4]
b = [2, 4, 7]
c = [1, 1, 1, 1]
def list_to_int(val: list):
result = 0
for i in range(-len(val), 0):
result += 10 ** abs(i + 1) * val[i]
return result
def int_to_list(val: int):
result = []
while val:
val, tail = divmod(val, 10)
result.insert(0, tail)
return result
def sum_list(*args):
return int_to_list(
sum(
map(
list_to_int, args
)
)
)
print(
sum_list(a, b)
)
# [7, 7, 1]
print(
sum_list(a, b, c)
)
# [1, 8, 8, 2]
Будет работать с любым количеством списков любой длины