Find the sum of two arrays

Question:

I am trying to find the sum of two lists/arrays in Python.

For example:

You are given with two random integer lists as lst1 and lst2 with size n and m respectively. Both the lists contain numbers from 0 to 9(i.e. single digit integer is present at every index).

The idea here is to represent each list as an integer in itself of digits N and M.

You need to find the sum of both the input list treating them as two integers and put the result in another list i.e. output list will also contain only single digit at every index.

Following is the code which I have tried:

def list_sum(lst1, n, lst2, m) :
    i, j, sum, carry = 0, 0, 0, 0
    new_lst = []
    if n == 0 and m == 0:
        new_lst.append(0)
    elif n > 0 and m>0:
        while n > 0 and m > 0:
            sum = lst1[n - 1] + lst2[m - 1] + carry
            if sum >= 10:
                carry = 1
            else:
                carry = 0
            new_lst.append(sum % 10)
            n -= 1
            m -= 1
        while n > 0:
            if (lst1[n-1] + carry) >= 10:
                new_lst.append((lst1[n-1] + carry) % 10)
                carry = 1
            else:
                new_lst.append(lst1[n-1])
                carry = 0
            n -= 1
        while m > 0:
            if (lst2[m-1] + carry) >= 10:
                new_lst.append((lst2[m-1] + carry) % 10)
                carry = 1
            else:
                new_lst.append(lst1[m-1])
                carry = 0
            m -= 1
        if carry == 1:
            new_lst.append(1)
        new_lst.reverse()
    elif n == 0 and m > 0:
        new_lst.append(0)
        new_lst = new_lst + lst2
    elif n > 0 and m == 0:
        new_lst.append(0)
        new_lst = new_lst + lst1
    print(new_lst)

however I feel I am missing something here and which is not giving me proper answer for the combination. Sometimes it errors list out of index error. I don’t know why.

The example input:

n = 3
lst1 = [6, 9, 8] 
m = 3
lst2 = [5, 9, 2]

output:

[1, 2, 9, 0]

Here, each element is summed and then if the sum >=10 then we get a carry = 1 and which will be added with the next sum.

i.e

1. 8+2= 10 >=10 hence carry=1 in first sum
2. 9+9+1( carry) = 19 >=10 hence carry=1
3. 6+5+1( carry) = 12>=10 hence carry=1
4. upend the carry to next position as 1
Hence resultant list would be [1, 2, 9, 0]

What can I try next?

Asked By: Humble_PrOgRaMeR

||

Answers:

If I understand correctly you want it like this:
[6, 9, 8], [5, 9, 2] -> 698 + 592 = 1290 -> [1, 2, 9, 0]

In that case my first idea would be to turn the numbers into strings, combine them to one string
and turn it into an int, then add both values together and turn into a list of integers again…
you can try this:

def get_sum_as_list(list1, list2):
    first_int = int(''.join(map(str,list1)))
    second_int = int(''.join(map(str,list2)))
    result = [int(num) for num in str(first_int+second_int)]
    return result
Answered By: user17824666

Here’s one possible solution:

(i) join each list to create a pair of string representation of integers

(ii) convert them to integers,

(iii) add them,

(iv) convert the sum to string

(v) separate each digit as ints

def list_sum(lst1, lst2):
    out = []
    for i, lst in enumerate([lst1, lst2]):
        if len(lst) > 0:
            out.append(int(''.join(str(x) for x in lst)))
        else:
            if i == 0:
                return lst2
            else:
                return lst1
    return [int(x) for x in str(out[0]+out[1])]

list_sum([6,9,8],[5,9,2])

Output:

[1, 2, 9, 0]
Answered By: user7864386

Two other answers show solutions repeatedly converting between lists of int and strings and ints. I think this is a bit cheating and completely hides the algorithm.

Here I present a solution that manipulates the lists of ints directly to build a third list of ints.

from itertools import chain, repeat # pad list with 0 so they are equal size
from operator import add            # add(x,y) = x+y

def padded(l1, l2):
    "padded([1, 2, 3], [1, 2, 3, 4, 5]) --> [0, 0, 1, 2, 3], [1, 2, 3, 4, 5]"
    padded1 = chain( repeat(0, max(0, len(l2)-len(l1))), l1 )
    padded2 = chain( repeat(0, max(0, len(l1)-len(l2))), l2 )
    return padded1, padded2

def add_without_carry_same_size(l1, l2):
    "add_without_carry([6, 9, 8], [5, 9, 2]) --> [11, 18, 10]"
    return map(add, l1, l2)

def flatten_carry(l):
    "flatten_carry([11, 18, 10]) --> [1, 2, 9, 0]"
    c = 0
    for i in range(len(l)-1, -1, -1):
        c, l[i] = divmod(c + l[i], 10)
    if c > 0:
        l[:] = [c] + l

def list_add(l1, l2):
    '''
    list_add([6, 9, 8], [5, 9, 2]) --> [1, 2, 9, 0]
    list_add([9, 9, 9, 9, 9], [1]) --> [1, 0, 0, 0, 0, 0]
    '''
    p1, p2 = padded(l1, l2)
    l3 = list(add_without_carry_same_size(p1, p2))
    flatten_carry(l3)
    return l3

Relevant documentation:

Answered By: Stef

Tried the following logic

def list_sum(lst1, n, lst2, m, output):
i, j, k, carry = n - 1, m - 1, max(n, m), 0
while i >= 0 and j >= 0:
    output[k] = (lst1[i] + lst2[j] + carry) % 10
    carry = (lst1[i] + lst2[j] + carry) // 10
    i = i - 1
    j = j - 1
    k = k - 1
while i >= 0:
    output[k] = (lst1[i] + carry) % 10
    carry = (lst1[i] + carry) // 10
    i = i - 1
    k = k - 1
while j >= 0:
    output[k] = (lst2[j] + carry) % 10
    carry = (lst2[j] + carry) // 10
    j = j - 1
    k = k - 1
output[0] = carry
print(output)

where the output parameter in the above code it taken from below

outputSize = (1 + max(n, m))
output = outputSize * [0]

and called the function

list_sum(lst1, n, lst2, m, output)
Answered By: Humble_PrOgRaMeR

Well, all other answers are awesome for adding 2 numbers (list of digits).
But in case you want to create a program which can deal with any number of 'numbers',

Here’s what you can do…

def addNums(lst1, lst2, *args):
    numsIters = [iter(num[::-1]) for num in [lst1, lst2] + list(args)]  # make the iterators for each list
    carry, final = 0, []                                                # Initially carry is 0, 'final' will store the result
    
    while True:
        nums = [next(num, None) for num in numsIters]                   # for every num in numIters, get the next element if exists, else None
        if all(nxt is None for nxt in nums): break                      # If all numIters returned None, it means all numbers have exhausted, hence break from the loop
        nums = [(0 if num is None else num) for num in nums]            # Convert all 'None' to '0'
        digit = sum(nums) + carry                                       # Sum up all digits and carry
        final.append(digit % 10)                                        # Insert the 'ones' digit of result into final list
        carry = digit // 10                                             # get the 'tens' digit and update it to carry

    if carry: final.append(carry)                                       # If carry is non-zero, insert it
    return final[::-1]                                                  # return the fully generated final list

print(addNums([6, 9, 8], [5, 9, 2]))                                    # [1, 2, 9, 0]
print(addNums([7, 6, 9, 8, 8], [5, 9, 2], [3, 5, 1, 7, 4]))             # [1, 1, 2, 7, 5, 4]

Hope that makes sense!

Answered By: HIMANSHU PANDEY

You don’t mention how long your lists will be. So considering they aren’t going to be that long (anyway, python can handle bignums), why not making a simple sum operation? In the end that’s what the code should emulate.

import numpy as np
lst1 = [6, 9, 8] 
lst2 = [5, 9, 2]
lst1_len = len(lst1)
lst2_len = len(lst2)
if lst1_len >= lst2_len:
    lst2 = [0] * (lst1_len - lst2_len) + lst2
else:
    lst1 = [0] * (lst2_len - lst1_len) + lst1

common_len = len(lst1)

lst1_val = sum(np.array(lst1) * np.array([10**(-x) for x in range(-common_len + 1, 1)]))
lst2_val = sum(np.array(lst2) * np.array([10**(-x) for x in range(-common_len + 1, 1)]))
total = lst1_val + lst2_val
total_as_list = [int(x) for x in str(total)]

where

print(total_as_list)
[1, 2, 9, 0]
Answered By: deponovo

Code:

def addNums(*args):
    nums=[]
    for i in args:                                
        if i:
            i = list(map(str,i))               # Converts each element int to string['6', '9', '8'] , ['5', '9', '2']
            add=int(''.join(i))                # Joins string and convert to int  698 ,592
            nums.append(add)                   # Appends them to list [698, 592]

    Sum = str(sum(nums))                       # Sums the values and convert to string '1290'
    result=list(map(int,Sum))                  # Converts to list with each converted to int[1,2,9,0]
    
    return result
print(addNums([6, 9, 8], [5, 9, 2]))  
print(addNums([7, 6], [5, 9], [3, 5],[7, 4]))
print(addNums([]))

Output:

[1, 2, 9, 0]
[2, 4, 4]
[0]
Answered By: Bibhav
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.