如何获得两个列表中整数和运算的所有组合?

时间:2018-08-28 10:19:36

标签: python python-3.x permutation

我有两个列表:

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()两个实际上获得列表中的元素。我只是不知道如何以这种方式排列两个列表。任何帮助将不胜感激。

谢谢

4 个答案:

答案 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, ...]

一点解释:对于intsopers的两个给定排列:

(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'