2 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
要將算術(shù)運(yùn)算符號(hào)轉(zhuǎn)換為 python 函數(shù),您可以使用dict它將符號(hào)與operator模塊中的函數(shù)匹配:
import operator
operations_map = {
"+": operator.add,
"-": operator.sub,
"*": operator.mul,
"/": operator.truediv
}
要處理整數(shù)和運(yùn)算符列表,您可以使用 next 函數(shù):
def process(numbers, operations):
if len(numbers) - 1 != len(operations):
raise ValueError(f"There're {len(numbers)} numbers and {len(operations)} operations.")
result = numbers[0]
for i in range(1, len(numbers)):
if operations[i - 1] in operations_map:
result = operations_map[operations[i - 1]](result, numbers[i])
else:
raise ValueError(f"\"{operations[i - 1]}\" is not valid operation.")
return result
用法:
process([50, 10, 20, 30, 40], ["+", "-", "+", "+"])
要查找結(jié)果最接近零的操作序列,您可以使用生成運(yùn)算符的排列itertools.permutations()并使用以下方法查找最小結(jié)果min():
from itertools import permutations
def closest_to_zero(numbers, operations):
return min(
((process(numbers, current), tuple(current)) for current in permutations(operations)),
key=lambda x: abs(x[0])
)
value, chain = closest_to_zero([50, 10, 20, 30, 40], ["+", "-", "+", "+"])
要從一組可能的運(yùn)算符中獲取所有可能的組合,您可以使用itertools.product(),其中repeat參數(shù)將設(shè)置為len(numbers) - 1:
from itertools import product
def closest_to_zero_patched(numbers, operations):
return min(
((process(numbers, current), tuple(current)) for current in
product(operations, repeat=len(numbers) - 1)),
key=lambda x: abs(x[0])
)
value, chain = closest_to_zero_patched([50, 10, 20, 30, 40], {"+", "-"})

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果你想要一個(gè)近乎單一的班輪(不一定是最有效的班輪):
您可以使用Truefor+和Falsefor對(duì)運(yùn)算符列表進(jìn)行編碼,并為列表的第一個(gè)元素-添加一個(gè)附加值(如果您總是希望添加此元素),以便您的列表如下所示:Truels1 = [-,-,-,+]
s1 = [True, False, False, False, True]
然后使用包中的compress函數(shù)itertools你得到你的結(jié)果:
from itertools import compress
sum(compress(l, s1)) - sum(compress(l, [not i for i in s1]))
它本質(zhì)上首先將與 's 關(guān)聯(lián)的所有元素相加+,然后減去與-'s 關(guān)聯(lián)的所有元素。
添加回答
舉報(bào)