我有两个列表:
ints = [10, 20, 30, 40, 50]
和
opers = ['+', '-', '*', '/']
我想获得一个包含这两个列表的所有可能组合的列表,例如:
10+20*40-30/50 = 810
50-40+30*20/10 = 70
等
列表应为[810, 70, ...]
我相信此列表中应该总共包含2880个元素。如果为int[0]==int[1]
,则为此目的它们将被单独计入。
我认为我必须使用eval()
两个实际上获得列表中的元素。我只是不知道如何以这种方式排列两个列表。任何帮助将不胜感激。
谢谢
答案 0 :(得分:2)
关键是使用datable_name.ajax.reload(function() {
$('#div_id').removeClass().addClass("text-green").html("Message").fadeIn();
},false);
功能。这是天真的方法:
itertools.permutations
输出看起来像这样(很明显,您可以将其放在字典中或其他内容中):
import itertools
ints = [10, 20, 30, 40, 50]
opers = ['+', '-', '*', '/']
for i in itertools.permutations(ints):
for o in itertools.permutations(opers):
s = f'{i[0]}{o[0]}{i[1]}{o[1]}{i[2]}{o[2]}{i[3]}{o[3]}{i[4]}'
print(f'{s} = {eval(s)}')
答案 1 :(得分:1)
创建所有排列,删除不适合的排列(数字操作...等)并计算:
<script>
$('#siguiente').click(function (e) {
if ($('input:radio[name="SelectedItem"]').is(':checked')){
e.preventDefault();
SendAjaxForm();
$('input:radio[name="SelectedItem"]').change(function () {
if (this.checked) {
$.post('@Url.Content("~/Home/Opciones/?idrespuesta=")' + this.id, function (data) {
$("#content-options").html(data);
});
}
});
} else {
alert("No se ha seleccionado nada");
}
});
</script>
输出:
from itertools import permutations
ints = ['10', '20', '30', '40', '50']
opers = [ '+', '-', '*', '/']
perm = permutations(ints+opers)
# sets for faster lookup
i = set(ints)
ops = set(opers)
fil = (p for p in perm
if all(p[k] in i if k%2==0 else p[k] in ops
for k in range(len(p))))
calcMe = [''.join(f) for f in fil]
calcMe = [''.join(f) for f in fil]
for cal in calcMe:
print(f"{cal}={eval(cal)}")
print(len(calcMe))
现在提供了更多需要的排列,如果不加思索地将其“ eval”本身视为“危险”。在这种情况下,应该可以,尽管我可以完全控制输入。
答案 2 :(得分:1)
1> st:start_state_maintainer().
true
2> st:lookup_state().
[]
3> st:update_state(fun (St) -> {testing, myval} end).
{true,{testing,myval}}
4> st:all_state().
[{testing,myval}]
5> length(ets:all()).
17
有点神秘的最后一行执行以下操作:
对于整数和运算符的给定排列,请压缩它们(缺失值为receive ...
)。将那些拉链对链接在一起,以形成一种“精梳”操作。 Pid ! ...
调用会删除from itertools import permutations, zip_longest, chain
def all_combinations(ints, ops):
for i in permutations(ints):
for o in permutations(ops):
yield "".join(filter(bool(chain.from_iterable(zip_longest(i, o)))))
,具体取决于您的品味,您可能还会喜欢其他方法。最后,None
将整数运算符序列转换为字符串。
答案 3 :(得分:1)
您可以使用一些itertools
创建这样的列表:
from itertools import permutations, chain, zip_longest
ints = [10, 20, 30, 40, 50]
opers = ['+', '-', '*', '/']
output = []
for int_perm in permutations(ints):
for op_perm in permutations(opers):
calculation = ''.join(map(str, chain.from_iterable(zip_longest(int_perm, op_perm, fillvalue=''))))
output.append(eval(calculation))
print(len(output))
# 2880
print(output)
# [6.0, -7.5, 609.2, -25.0, -1989.3333333333333, ...]
一点解释:对于ints
和opers
的两个给定排列:
(10, 30, 50, 20, 40)
('-', '*', '/', '+')
zip_longest
将为我们提供:(请注意,由于opers
列表较短,缺失值将由填充值''
填充)
print(list((zip_longest(int_perm, op_perm, fillvalue=''))))
# [(10, '-'), (30, '*'), (50, '/'), (20, '+'), (40, '')]
并在此列表中链接元组将给我们:
print(list(chain.from_iterable(zip_longest(int_perm, op_perm, fillvalue=''))))
# [10, '-', 30, '*', 50, '/', 20, '+', 40, '']
我们只需要将所有项目映射到字符串并将它们连接起来即可:
# '10-30*50/20+40'