首页 > 解决方案 > 基于阈值对元素求和

问题描述

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

编写一个函数 mysum_bigger_than ,它的工作原理与 mysum 相同,只是它采用 *args 之前的第一个参数。该参数表示在总和中包含参数的阈值。因此,调用 mysum_bigger _than(10, 5, 20, 30, 6) 将返回 50 ——因为 5 和 6 不大于 10 。这个函数应该同样适用于任何类型,并假定所有参数都是相同的类型。请注意,'>' 和 '<' 适用于 Python 中的许多不同类型,而不仅仅是数字;对于字符串、列表和元组,它指的是它们的排序顺序。

代码下面的问题:我不能在没有阈值本身的情况下对大于阈值的元素求和!

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'

标签: pythonfunctionloopssumslice

解决方案


您的尝试存在一个问题:您使用阈值 ( 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是一个控制变量:它的值是False只要值values低于阈值。一旦第一个值高于阈值,它的值就会设置为True。同时,result变量得到“正确”初始化,然后用作求和变量。如果 in 中没有值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如果不是这种情况,该函数将返回。其余的只是对过滤后的值进行总结,如果有的话。

如果允许,您可以使用标准库中的一些工具,reduce并且add

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,因为根据设计它不适用于字符串。)


推荐阅读