关于python:编写一个自定义求和函数,它对一个数字列表求和

Writing a custom sum function that sums a list of numbers

我不熟悉Python,需要一些帮助来编写一个以列表为参数的函数。

我希望用户能够输入一个数字列表(例如[1,2,3,4,5]),然后让我的程序对列表中的元素求和。但是,我想使用for循环来求和元素,而不仅仅是使用内置的sum函数。

我的问题是我不知道如何告诉解释器用户正在输入列表。当我使用此代码时:

1
  def sum(list):

它不起作用,因为解释器只需要从sum中提取一个元素,但我想输入一个列表,而不仅仅是一个元素。我尝试使用list.append(…),但无法按我想要的方式工作。

感谢期待!

编辑:我在找类似这样的东西(谢谢,"艾伦豪斯"):

1
2
3
4
5
6
7
8
def listsum(list):
    ret=0
    for i in list:
        ret += i
    return ret

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


我不知道你是如何构建"用户输入列表"的。你在使用循环吗?它是纯输入吗?你在读JSON还是泡菜?这是一个很大的未知数。

假设您试图让他们输入逗号分隔的值,只是为了得到一个答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
# ASSUMING PYTHON3

user_input = input("Enter a list of numbers, comma-separated
>>"
)
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

前三行有点难看。您可以组合它们:

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

但那也有点难看。怎么样:

1
2
3
4
5
6
7
8
raw_in = input("Enter a list of numbers, comma-separated
>>"
).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


这适用于python 3.x,与AdamSmith解决方案类似。

1
2
3
4
5
6
7
8
9
10
11
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)


Python中的for循环非常容易使用。对于您的应用程序,类似这样的方法可以工作:

1
2
3
4
5
6
7
8
9
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

编辑:是的,我很慢。另一个答案可能更有用。;)


这是一个有点慢的版本,但效果很好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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])

甚至可以编写一个函数,该函数可以对列表中嵌套列表中的元素求和。例如,它可以求和[1, 2, [1, 2, [1, 2]]]

1
2
3
4
5
6
7
8
9
10
    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

对于my_sum([1, 2, [1, 2, [1, 2]]])。输出为9

如果您为此任务使用标准的内置函数sum,它将引发TypeError


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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


这里的函数addelements接受列表,并且仅当传递给函数addelements的参数是list并且列表中的所有元素都是integers时,返回该列表中所有元素的和。否则函数将返回消息"not a list or list does not all the integer elements"

1
2
3
4
5
6
7
8
9
10
11
12
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)

输出:

1
45