Writing a custom sum function that sums a list of numbers
我不熟悉Python,需要一些帮助来编写一个以列表为参数的函数。
我希望用户能够输入一个数字列表(例如[1,2,3,4,5]),然后让我的程序对列表中的元素求和。但是,我想使用for循环来求和元素,而不仅仅是使用内置的
我的问题是我不知道如何告诉解释器用户正在输入列表。当我使用此代码时:
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 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 |
。
对于
如果您为此任务使用标准的内置函数
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 |
这里的函数
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 |
号