【问题标题】:Writing a custom sum function that sums a list of numbers编写一个自定义 sum 函数,对数字列表求和
【发布时间】:2014-06-11 09:15:24
【问题描述】:

我是 Python 新手,需要一些帮助来编写一个将列表作为参数的函数。

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

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

  def sum(list):

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

感谢期待!

编辑:我正在寻找这样的东西(谢谢,“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.

【问题讨论】:

  • 如何存储用户输入?你能发布一些你已经尝试过的代码吗?
  • 我了解您是初学者,这很好。我不清楚您所说的“口译员想要一份清单”是什么意思。你能详细说明你做了什么吗?你学会怎么写循环了吗?
  • 另外,你不应该在内置后命名,即“list”
  • [float(i) for i in raw_input('lists of numbers').rstrip(']').lstrip('[').split(',')] 获取快速而骇人听闻的解决方案。
  • 向我们展示您尝试过的所有代码,而不仅仅是您对 sum 的定义。特别是,向我们展示您的输入代码和周边代码。

标签: python loops for-loop


【解决方案1】:

我不确定您是如何构建“用户输入列表”的。你在使用循环吗?是纯输入吗?你读的是 JSON 还是 pickle?这是最大的未知数。

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

# 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

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

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

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

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

【讨论】:

  • 非常感谢,但这对我来说有点太多了。请查看我编辑的问题,看看我在寻找什么。
  • @user2938633 您正在寻找的答案特别要求我们知道您输入的内容。您似乎在要求它的每条评论中都掩盖了该要求,因此我假设您已经知道如何获取用户的输入。如果是这样,请准确告诉我们用户输入的内容。不要说他们输入[1,2,3],告诉我们他们输入"1, 2, 3"然后你用逗号分割,或者他们输入"[1,2,3]"然后你解析出括号和逗号等等。
【解决方案2】:

Python 中的 for 循环非常易于使用。对于您的应用程序,这样的工作:

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

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

【讨论】:

  • @user2938633,irenhaus3 不要使用list 作为变量名。
  • 只有一个问题:我必须调用“打印 listsum([2,3,4])。它不能与 listsum([2,3,4]) 一起使用吗???跨度>
  • @GrijeshChauhan 你当然是对的。我自己应该想到的。谢谢你说清楚。
【解决方案3】:

这适用于 python 3.x,类似于 Adam Smith 解决方案

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)

【讨论】:

    【解决方案4】:

    您甚至可以编写一个函数来对列表中嵌套列表中的元素求和。例如可以求和[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
    

    my_sum([1, 2, [1, 2, [1, 2]]]) 输出将是9

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

    【讨论】:

      【解决方案5】:

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

      # 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])
      

      【讨论】:

        【解决方案6】:

        这应该很好用

        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)
        

        }

        【讨论】:

        • 你还没有定义一个函数,这就是最初的问题。
        【解决方案7】:

        使用累加器函数将累加器变量(runTotal)初始化为 0:

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

        打印 sumTo(15) #输出 120

        【讨论】:

        • 欢迎来到 SO。请在您的答案中添加一些解释。
        【解决方案8】:

        如果您使用Python 3.0.1 或更高版本,请使用以下代码使用reduce 对数字/整数列表求和

        from functools import reduce
        from operator import add
        
        def sumList(list):
             return reduce(add, list)
        

        【讨论】:

          【解决方案9】:
          def oper_all(arr, oper):
              sumlist=0
              for x in arr:
                  sumlist+=x
              return sumlist
          

          【讨论】:

          • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
          • oper 参数?你没有利用它。
          【解决方案10】:

          这里的函数addelements 接受列表并返回该列表中所有元素的总和,前提是传递给函数addelements 的参数是list 并且该列表中的所有元素都是integers。否则函数将返回消息“不是列表或列表没有所有整数元素”

          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)
          

          输出:

          45
          

          【讨论】:

          • 为什么你在第一个版本中使用isinstance,而在这个版本中使用type ==?我很困惑。
          • @AdamSmith 在第一个条件下,我正在检查列表中的每个元素都是 int 并且输入的列表是列表的实例。
          • isinstance 是检查这个的方法
          • @Llopis 你能多探索一下吗?谢谢
          • @Fledgling 你在同一行中使用了isinstance。只需使用它来检查item 是否也是int :P。自从你要求我编辑后,我就为你编辑了。
          【解决方案11】:
          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
          

          【讨论】:

          • 欢迎来到 SO。这并没有真正回答最初的问题。 OP 正在尝试编写自己的 sum() 实现......不知道它已经存在多少个不同版本。
          • 这与编写 sum 函数的版本没有任何关系。
          猜你喜欢
          • 1970-01-01
          • 2019-03-14
          • 1970-01-01
          • 2016-02-27
          • 1970-01-01
          • 2016-07-21
          • 1970-01-01
          相关资源
          最近更新 更多