所以基本上我有一个列表[[40,1,3,4,20]
,如果有一个排列,我可以返回TRUE,我可以重新排列列表中的数字并结合数学运算,得出总计42。这些运算符为:(+,-,*。示例为20 * 4-40 + 3-1 = 42,因此它将为列表[40,1,3,4,20]返回
true`。 。
对于这个问题,我尝试使用itertool的替换功能组合来获取所有可能的运算符组合的列表:
from itertools import permutations, combinations, combinations_with_replacement
ops = []
perm = permutations([40,1,3,4,20], 5)
comb = combinations_with_replacement(["+","-","\*], 5)
for i in list(comb):
ops.append(i)
print(ops)
这给了我:
[('+', '+', '+', '+', '+'),
('+', '+', '+', '+', '-'),
('+', '+', '+', '+', '\*),
('+', '+', '+', '-', '-'),
('+', '+', '+', '-', '\*),
('+', '+', '+', '\*, '\*),
('+', '+', '-', '-', '-'),
('+', '+', '-', '-', '\*),
('+', '+', '-', '\*, '\*),
('+', '+', '\*, '\*, '\*),
('+', '-', '-', '-', '-'),
('+', '-', '-', '-', '\*),
('+', '-', '-', '\*, '\*),
('+', '-', '\*, '\*, '\*),
('+', '\*, '\*, '\*, '\*),
('-', '-', '-', '-', '-'),
('-', '-', '-', '-', '\*),
('-', '-', '-', '\*, '\*),
('-', '-', '\*, '\*, '\*),
('-', '\*, '\*, '\*, '\*),
('\*, '\*, '\*, '\*, '\*)]
我将如何应用这21种独特的数学运算组合并将其迭代到列表中的元素上?我尝试了几件事,但一切都变得有些毛茸茸和令人困惑。
问题来源:stackoverflow
对于值的每个子列表,对于运算符的每个子列表:计算结果
you can now check if is equals your goal value
it it matches, some formatting, and you're done with an expression
from itertools import permutations, product, chain, zip_longest from operator import add, sub, mul
def operator_to_symbol(ope): return {add: "+", sub: "-", mul: "*}.get(ope, "")
def format_result(values, ops): return " ".join(list(chain(*ip_longest(values, ops)))[:-1])
def evaluate(values, operators): v = values[0] for idx, val in enumerate(values[1:]): v = operators[idx](v, val) return v
if name == "main": perm_values = list(permutations([40, 1, 3, 4, 20], 5)) comb_operator = list(product([add, sub, mul], repeat=4))
goal = 42
for p in perm_values:
for c in comb_operator:
v = evaluate(p, c)
if v == 42:
print(format_result(map(str, p), list(map(operator_to_symbol, c))), "=", goal)
仅给出一个独特的结果:
4 * 20 - 40 - 1 + 3 = 42
4 * 20 - 40 + 3 - 1 = 42
4 * 20 - 1 - 40 + 3 = 42
4 * 20 - 1 + 3 - 40 = 42
4 * 20 + 3 - 40 - 1 = 42
4 * 20 + 3 - 1 - 40 = 42
20 * 4 - 40 - 1 + 3 = 42
20 * 4 - 40 + 3 - 1 = 42
20 * 4 - 1 - 40 + 3 = 42
20 * 4 - 1 + 3 - 40 = 42
20 * 4 + 3 - 40 - 1 = 42
20 * 4 + 3 - 1 - 40 = 42
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。