基于阈值求和元素
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
如果不是这样的话。剩下的只是对过滤后的值求和,如果有的话。
如果允许,您可以使用标准库中的一些工具,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
,因为按照设计它不适用于字符串。)
我正在做作业的时候遇到了这个问题:
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
如果不是这样的话。剩下的只是对过滤后的值求和,如果有的话。
如果允许,您可以使用标准库中的一些工具,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
,因为按照设计它不适用于字符串。)