簡體   English   中英

基於閾值的元素求和

[英]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 其余的只是對過濾后的值進行總結,如果有的話。

如果允許,您可以使用標准庫中的一些工具, 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 ,因為按照設計它不適用於字符串。)

試試這個方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM