[英]Summing elements based on threshold
遇到這個問題時,我正在做功課:
編寫一個函數 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
與函數定義中的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 中的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
。 其余的只是對過濾后的值進行總結,如果有的話。
如果允許,您可以使用標准庫中的一些工具, 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
,因為按照設計它不適用於字符串。)
試試這個方法:
def mysum_bigger_than(*values):
if not values:
return values
cond = lambda x: x > values[0]
return sum(filter(cond, values[1:]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.