基于阈值求和元素

Summing elements based on threshold

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

Write a function, mysum_bigger_than , that works the same as mysum , except that it takes a first argument that precedes *args . That argument indicates the threshold for including an argument in the sum. Thus, calling mysum_bigger _than(10, 5, 20, 30, 6) would return 50 —because 5 and 6 aren’t greater than 10 . This function should similarly work with any type and assumes that all of the arguments are of the same type. Note that '>' and '<' work on many different types in Python, not just on numbers; with strings, lists, and tuples, it refers to their sort order.

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

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'

试试这个方法:

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

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

... except that it takes a first argument that precedes *args ...

所以

def mysum_bigger_than(threshold, *values):

这样做的好处是 (1) 不提供 threshold 函数会 return 出错。并且 (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 中没有任何值高于函数 returns 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 中过滤那些满足大于阈值要求的值(使用列表理解)。下一步检查是否确实存在大于阈值的值。函数 returns 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,因为按照设计它不适用于字符串。)