【问题标题】:Summing elements based on threshold基于阈值对元素求和
【发布时间】:2021-09-25 21:33:12
【问题描述】:

遇到这个问题时我正在做作业:

编写一个函数 mysum_bigger_than ,它的工作原理与 mysum 相同, 除了它需要在 *args 之前的第一个参数。那 参数表示在总和中包含参数的阈值。 因此,调用 mysum_bigger _than(10, 5, 20, 30, 6) 将返回 50——因为 5 和 6 不大于 10 。这个函数应该同样适用于任何类型 并假设所有参数都是同一类型。请注意,'>' 和 '

下面代码的问题:如果没有阈值本身,我无法对大于阈值的元素求和!

def mysum_bigger_than(*values):
    if not values:
        return values
    output = values[0]
    for value in values[1:]:
        if value < output:
            continue
        else:
            output += value 
    return output

print(mysum_bigger_than(10,5,20,30,6)) #returns 60 instead of 50
print(mysum_bigger_than('mno', 'abc', 'pqr', 'uvw', 'efg', 'xyz')) #returns everything i need with unnecessary 'mno'

【问题讨论】:

    标签: python function loops sum slice


    【解决方案1】:

    试试这个方法:

    def mysum_bigger_than(*values):
        if not values:
            return values
        cond = lambda x: x > values[0]
        return sum(filter(cond, values[1:]))
    

    【讨论】:

      【解决方案2】:

      您的尝试存在一个问题:您使用阈值 (output) 作为求和的起点。另一个:您检查大于和等于阈值。而且我认为您实际上应该根据说明的这一部分对您的函数签名进行建模:

      ... 除了它需要在 *args ... 之前的第一个参数...

      所以

      def mysum_bigger_than(threshold, *values):
      

      这样做的好处是 (1) 如果不提​​供threshold,该函数将返回错误。并且 (2) 您不必将阈值与函数定义中的values 列表分开。

      这里有一个建议:

      def mysum_bigger_than(threshold, *values):
          summing = False
          result = None
          for value in values:
              if value > threshold:
                  if summing:
                      result += value
                  else:
                      result = value
                      summing = True
          return result
      

      summing 是一个控制变量:只要values 中的值低于阈值,它的值就是False。一旦第一个值高于阈值,它的值就会设置为True。同时,result 变量得到“正确”初始化,然后用作求和变量。如果values 中没有任何值高于阈值,则函数返回None,否则返回所需的总和。

      这是另一个建议,它更紧凑但可能效率不高(这只对极大的values 列表很重要):

      def mysum_bigger_than(threshold, *values):
          sum_values = [value for value in values if value > threshold]
          if not sum_values:
              return None
          result = sum_values[0]
          for value in sum_values[1:]:
              result += value
          return result
      

      第一步过滤来自values 的满足大于阈值要求的值(使用列表理解)。下一步检查是否有实际值大于阈值。如果不是这种情况,该函数将返回 None。剩下的只是对过滤后的值进行总结,如果有的话。

      如果允许,您可以使用标准库中的一些工具,reduceadd

      from functools import reduce
      from operator import add
      
      def mysum_bigger_than(threshold, *values):
          sum_values = [value for value in values if value > threshold]
          if not sum_values:
              return None
          return reduce(add, sum_values)
      

      但我认为这有点矫枉过正。

      (你绝对不应该在这里使用sum,因为从设计上它不适用于字符串。)

      【讨论】:

      • 坦率地说,我不明白 'args' 在这里是什么意思,我的意思是,'' 是我们想要添加未定义数量的值时的意思。 'args' 这里只是值的名称?
      • @PreacherBaby 是的,你是对的。我选择了args,因为这是说明中使用的名称。您也可以像在代码中那样使用values,它更好地描述了参数的作用。
      • @PreacherBaby 我刚刚将args 更改为values
      • @PreacherBaby 你也可以使用if summing == True,或者更好的if summing is Trueif summing 检查summing 的“真实性”,即bool(summing)。据我所知,这是最pythonic 的使用方式。但最终这只是一种偏好。
      • @PreacherBaby 回复None:没错。 result = value; summing = True 部分仅在第一次值大于阈值时执行。在此之前result 的值是None。现在result 被赋予了正确的起始值,summing = True 确保在下面使用if summing: 分支。
      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 2016-01-03
      • 2019-08-23
      • 1970-01-01
      相关资源
      最近更新 更多