Blnpwr
Blnpwr

Reputation: 1875

Writing a custom sum function that sums a list of numbers

I am new to Python and need some help writing a function that takes a list as an argument.

I want a user to be able to enter a list of numbers (e.g., [1,2,3,4,5]), and then have my program sum the elements of the list. However, I want to sum the elements using a for loop, not just by using the built in sum function.

My problem is that I don't know how to tell the interpreter that the user is entering a list. When I use this code:

def sum(list):

It doesn't work because the interpreter wants just ONE element that is taken from sum, but I want to enter a list, not just one element. I tried using list.append(..), but couldn't get that to work the way I want.

Thanks in anticipation!

EDIT: I am looking for something like this (thanks, "irrenhaus"):

def listsum(list):
    ret=0
    for i in list:
        ret += i
    return ret

# The test case:
print listsum([2,3,4])  # Should output 9.

Upvotes: 6

Views: 56772

Answers (11)

Mayans46
Mayans46

Reputation: 1

def oper_all(arr, oper):
    sumlist=0
    for x in arr:
        sumlist+=x
    return sumlist

Upvotes: 0

Bharathiraja
Bharathiraja

Reputation: 812

If you are using Python 3.0.1 or above version then use below code for Summing list of numbers / integer using reduce

from functools import reduce
from operator import add

def sumList(list):
     return reduce(add, list)

Upvotes: 0

debiday
debiday

Reputation: 47

Using accumulator function which initializes accumulator variable(runTotal) with a value of 0:

def sumTo(n):
runTotal=0
for i in range(n+1):
    runTotal=runTotal+i
return runTotal

print sumTo(15) #outputs 120

Upvotes: 0

This should work nicely

user_input =  input("Enter a list of numbers separated by a comma")
user_list = user_input.split(",")

print ("The list of numbers entered by user:" user_list)


ds = 0
for i in user_list:
    ds += int(i)
print("sum = ", ds)

}

Upvotes: 0

Rafael Díaz
Rafael Díaz

Reputation: 2289

This is a somewhat slow version but it works wonders

# option 1
    def sumP(x):
        total = 0
        for i in range(0,len(x)):
            total = total + x[i]
        return(total)    

# option 2
def listsum(numList):
   if len(numList) == 1:
        return numList[0]
   else:
        return numList[0] + listsum(numList[1:])

sumP([2,3,4]),listsum([2,3,4])

Upvotes: 0

Przemek
Przemek

Reputation: 647

You can even write a function that can sum elements in nested list within a list. For example it can sum [1, 2, [1, 2, [1, 2]]]

    def my_sum(args):
    sum = 0
    for arg in args:
        if isinstance(arg, (list, tuple)):
            sum += my_sum(arg)
        elif isinstance(arg, int):
            sum += arg
        else:
            raise TypeError("unsupported object of type: {}".format(type(arg)))
    return sum

for my_sum([1, 2, [1, 2, [1, 2]]]) the output will be 9.

If you used standard buildin function sum for this task it would raise an TypeError.

Upvotes: 0

mgg07
mgg07

Reputation: 1

import math



#get your imput and evalute for non numbers

test = (1,2,3,4)

print sum([test[i-1] for i in range(len(test))])
#prints 1 + 2 +3 + 4 -> 10
#another sum with custom function
print math.fsum([math.pow(test[i-1],i) for i in range(len(test))])
#this it will give result 33 but why? 
print [(test[i-1],i) for i in range(len(test))]
#output -> [(4,0), (1, 1) , (2, 2), (3,3)] 
# 4 ^ 0 + 1 ^ 1 + 2 ^ 2 + 3 ^ 3 -> 33

Upvotes: -1

Nishant Nawarkhede
Nishant Nawarkhede

Reputation: 8390

Here the function addelements accept list and return sum of all elements in that list only if the parameter passed to function addelements is list and all the elements in that list are integers. Otherwise function will return message "Not a list or list does not have all the integer elements"

def addelements(l):
    if all(isinstance(item,int) for item in l) and isinstance(l,list):
        add=0
        for j in l:
            add+=j
        return add
    return 'Not a list or list does not have all the integer elements'

if __name__=="__main__":
    l=[i for i in range(1,10)]
#     l.append("A") This line will print msg "Not a list or list does not have all the integer elements"
    print addelements(l)

Output:

45

Upvotes: -1

Adam Smith
Adam Smith

Reputation: 54163

I'm not sure how you're building your "user entered list." Are you using a loop? Is it a pure input? Are you reading from JSON or pickle? That's the big unknown.

Let's say you're trying to get them to enter comma-separated values, just for the sake of having an answer.

# ASSUMING PYTHON3

user_input = input("Enter a list of numbers, comma-separated\n>> ")
user_input_as_list = user_input.split(",")
user_input_as_numbers_in_list = map(float, user_input_as_list) # maybe int?
# This will fail if the user entered any input that ISN'T a number

def sum(lst):
    accumulator = 0
    for element in lst:
        accumulator += element
    return accumulator

The top three lines are kind of ugly. You can combine them:

user_input = map(float, input("Enter a list of numbers, comma-separated\n>> ").split(','))

But that's kind of ugly too. How about:

raw_in = input("Enter a list of numbers, comma-separated\n>> ").split(',')
try:
    processed_in = map(float, raw_in)
    # if you specifically need this as a list, you'll have to do `list(map(...))`
    # but map objects are iterable so...
except ValueError:
    # not all values were numbers, so handle it

Upvotes: 4

llrs
llrs

Reputation: 3397

This will work for python 3.x, It is similar to the Adam Smith solution

list_user = str(input("Please add the list you want to sum of format [1,2,3,4,5]:\t"))
total = 0
list_user = list_user.split() #Get each element of the input
for value in list_user:
    try:
        value = int(value) #Check if it is number
    except:
        continue
    total += value

print(total)

Upvotes: 1

irrenhaus3
irrenhaus3

Reputation: 309

The for loop in Python is exceptionally easy to use. For your application, something like this works:

def listsum(list):
    ret=0
    for i in list:
        ret+=i
    return ret

# the test case:
print listsum([2,3,4])
# will then output 9

Edit: Aye, I am slow. The other answer is probably way more helpful. ;)

Upvotes: 1

Related Questions