我有一組變數,每個變數都包含一組選定的整數:
var_1 = [0.5, 1, 2]
var_2 = [0.5, 1, 4, 7.5]
var_3 = [1, 1.5, 3.5, 4, 5.5, 10]
我想從上面提到的每個變數中選擇每個數字并將它們加在一起,直到這些變數的第一個組合落在指定的獲勝范圍內,例如:
winning_range = [15-20]
所以上面的 win_range 將是落在整數 15-20 之間的第一個組合
我想將獲勝組合列印為字典,其中包含每個組合件以及一個顯示數字相加值的字典鍵:
{var_1 = 2, var_2= 7.5, var_3= 10, total= 19.5}
通過python獲得它的最有效方法是什么?
uj5u.com熱心網友回復:
您可以使用遞回生成器函式:
r = [15, 20]
var_1 = [0.5, 1, 2]
var_2 = [0.5, 1, 4, 7.5]
var_3 = [1, 1.5, 3.5, 4, 5.5, 10]
def combos(d, c = [], s = 0):
if not d and r[0] <= s and r[-1] >= s:
yield (c, s)
elif d:
for i in filter(lambda x:r[-1] >= x s, d[0]):
yield from combos(d[1:], c=c [i], s=s i)
print(list(combos([var_1, var_2, var_3])))
輸出:
[([0.5, 7.5, 10], 18.0), ([1, 4, 10], 15), ([1, 7.5, 10], 18.5), ([2, 4, 10], 16), ([2, 7.5, 5.5], 15.0), ([2, 7.5, 10], 19.5)]
在這里,在每次遞回呼叫中,var只有當運行總和加上該值不超過最大閾值時,才會包括串列中的潛在值,從而最大限度地減少所需的遞回呼叫總數。雖然list(combos([var_1, var_2, var_3]))將所有可能性加載到記憶體中,但您可以使用next僅獲取第一個結果:
vals, total = next(combos([var_1, var_2, var_3]))
uj5u.com熱心網友回復:
也許不是最有效的,但非常易讀
var_1 = [0.5, 1, 2]
var_2 = [0.5, 1, 4, 7.5]
var_3 = [1, 1.5, 3.5, 4, 5.5, 10]
winning_range = [15, 20] # Converting to a list for [min, max]
result = {}
for v1 in var_1:
for v2 in var_2:
for v3 in var_3:
if v1 v2 v3 in range(winning_range[0], winning_range[1]):
result = {"var_1": v1, "var_2": v2, "var_3": v3}
print(result)
# Output
# {'var_1': 2, 'var_2': 7.5, 'var_3': 5.5}
我應該添加你指定的第一個組合,所以這個解決方案實際上是按順序嘗試它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/345346.html
上一篇:用NA替換對稱矩陣的元素對
