python - 基于阈值对元素求和
问题描述
当我遇到这个问题时,我正在做作业:
编写一个函数 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'
解决方案
您的尝试存在一个问题:您使用阈值 ( 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
,因为根据设计它不适用于字符串。)
推荐阅读
- .htaccess - 如何在不更改 URL 的情况下进行重定向(完全,不仅仅是一页)
- c# - 不要重复自己或通过重复自己来更清楚?
- jquery - 如何选择输入:具有特定属性(最大长度)的特定值的文本?
- c# - 在 C# 中插入矢量图像
- c# - 如何为 Microsoft.codeAnalysis.CSharp 配置 BindingRedirects
- javascript - Linux 上的透明窗口(电子)
- flutter - Flutter:为什么我不能更改 suffixIcon 大小
- bash - 获取分支修订号
- knockout.js - 如何使用 Knockout.js 自定义绑定处理文本字段的内容?
- angular - 在Angular 6中获取组件的数组数据到另一个组件