【问题标题】:Calculating the sum of the list and removing -1 values计算列表的总和并删除 -1 值
【发布时间】:2020-11-29 20:31:14
【问题描述】:

我想编写一个 python 程序,如果最后一个元素是 -1,则给定用户输入列表打印 -1,然后如果列表中的任何元素包含不应计数的 -1 和剩余数组总和。

例如:

1) list=[1,2,3,4,5] ans should be 15 

2) list=[1,2,3,4,-1] ans should be -1
3) list=[1,2,-1,4,5] ans should be 12 ignoring "-1"

我尝试了 2 种解决方案,但都没有奏效。

import sys
def totalcost(ar):

  if ar[-1]==-1:
    return -1
  else:
    summ=0
    for elem in ar:
        if(ar[elem]==-1):
            ar.remove(elem)
            summ=summ+elem
        else:        
            summ=summ+elem      
        return summ
if __name__=='__main__':
  ar_city=input()
  ar=list(map(int,input().strip().split()))
  result=totalcost(ar)
  print(result)  
import sys
def totalcost(ar):

  if ar[-1]==-1:
    return -1
  else:
    summ=0
    for elem in ar:
        if(ar[elem]<0):
            ar_new=ar.remove(elem)
            for i in ar_new:
                summ=summ+i
        else:        
            summ=summ+elem      
        return summ
if __name__=='__main__':
  ar_city=input()
  ar=list(map(int,input().strip().split()))
  result=totalcost(ar)
  print(result)  

【问题讨论】:

  • “没有工作” - 请准确描述出了什么问题。如果您收到错误,请包含完整的错误回溯。如果你得到一些错误的输出,包括测试用例,你得到的输出与预期的输出。另外,最好只包含一段代码。
  • 这里你做错了什么 if(ar[elem]
  • 简单完成,您可以遍历列表并将当前元素添加到预定义的 sum 变量(如果它不是负数)

标签: python arrays list loops


【解决方案1】:

这个问题有很多可能的解决方案。我不是在写单行字,因为其他人已经写过了。
我正在编写我认为最简单的解决方案。

def total_sum(arr):
    if arr[-1]==-1:
        return -1
    sum_arr = 0
    for elem in arr:
        if elem == -1:
            continue
        else:
            sum_arr+=elem
    return sum_arr   

【讨论】:

    【解决方案2】:

    以下是你犯的错误:

    1. ar[elem] 没有正确地迭代 ar 中的每个元素。
    2. 您在 for-in 循环中返回 summ,因此它只会返回第一个元素的值。

    这是一个根据您的代码修改的工作示例。

    def totalcost(ar):
        if ar[-1] == -1:
            return -1
        summ = 0
        for elem in ar:
            if(elem != -1):
                summ += elem
        return summ
    

    【讨论】:

      【解决方案3】:

      为 Riccardo 的回答添加了解释:

      def get_sum(arr):
          return -1 if arr[-1] == -1 else sum(item for item in arr if item != -1)
      

      说明

      函数的第一部分将返回-1如果列表的最后一个值为-1,那么在else部分:如果项目不是@987654326,它将在list中创建项目列表@ 使用列表理解。然后它调用内置的 sum 方法来查找结果列表的总和并返回。

      了解详情

      【讨论】:

      • 这与其他答案不“相似”,它与我的答案相同 :) 你可以编辑我的答案
      • @RiccardoBucco 抱歉,我的意思实际上是已删除的答案,不要以为我在回答时看到了您的答案
      • 在sum([item for item in list if item != -1]) 中建立一个中间列表是没有用的而且效率低下,就做sum(x for x in ar if x != -1) 吧。
      • 我的答案是第一个,所以你不可能看到另一个答案而不是我的答案。无论如何,至少不要对变量使用保留字(“list”),不要在sum 函数内创建无用的列表。
      • 感谢您的建议,我编辑了它。可能是因为在您发布答案后它没有立即弹出,但无论如何我都给了您信任。以后我会修改你的答案,谢谢
      【解决方案4】:

      这是一个可能的解决方案:

      def totalcost(ar):
          return -1 if ar[-1] == -1 else sum(x for x in ar if x != -1)
      

      如果您不想要使用列表推导的单行解决方案,您可以执行以下操作:

      def totalcost(ar):
          if ar[-1] == -1:
              return -1
          s = 0
          for x in ar:
              if x != -1:
                  s += x
          return s
      

      【讨论】:

        【解决方案5】:

        我认为您可以简单地使用 filter 和 sum 以及 lambda 来实现。 只是稍微更新了你的总成本函数

        import sys
        def totalcost(ar):
            if ar[-1] == -1:
                return -1
            else:
                ar_filtered = filter(lambda x: x > 0, ar)
        
                return sum(ar_filtered)
        
        if __name__ == '__main__':
            ar_city = [1, 2, 3, 4, 5]
            assert totalcost(ar_city) == 15
        
            ar_city = [1, 2, 3, 4, -1]
            assert totalcost(ar_city) == -1
        
            ar_city = [1, 2, -1, 4, 5]
            assert totalcost(ar_city) == 12
        

        Lambda 参考:https://realpython.com/python-lambda/

        【讨论】:

          【解决方案6】:

          您可以使用一些简单的功能来改善您的生活:

          sum(filter(lambda x: x != -1, ls))
          
          1. sum - 对迭代求和而不使用 for 循环
          2. filter - 从可迭代中过滤掉不需要的元素。在这种情况下,我使用简单的 lambda x: x != -1 过滤掉 ls 中的所有 -1。

          当然,这应该在你的初始条件之后使用,像这样:

          if ls[-1] == -1:
              return -1
          return sum(filter(lambda x: x != -1, ls))
          

          如果你愿意,你可以阅读列表理解与 lambda + 过滤器here

          【讨论】:

          • 还要记得检查最后一个 -1
          • 现在这是一个非常明确的答案,点赞!值得一提的是,使用 lambda 函数会稍微降低性能。
          • 关于什么?循环?
          • 将filter 与 lambda 函数(而不是内置 Python 函数)一起使用通常比使用列表理解要慢,因为您链接状态的答案
          • 是的。有函数调用开销。虽然我发现它更清晰、更短、更整洁 :) 我非常怀疑 OP 是否关心这种微小的性能水平
          猜你喜欢
          • 2017-12-11
          • 2022-01-10
          • 1970-01-01
          • 2020-01-02
          • 1970-01-01
          • 2017-03-22
          • 1970-01-01
          • 2018-03-13
          • 2022-01-20
          相关资源
          最近更新 更多