У меня есть все возможные комбинации операций между числами в списке:

list = ['2','7','8']

7+8*2
8+7*2
2*8+7
2+8*7
2-8*7
8-2/7
etc

Я хочу знать, можно ли сказать, что такие операции, как ('7*2+8' и '8+7*2' и '2*7+8') или (7*8*2 и 2*8*7 и 7*2*8) и т. д. одинаковы. Я хочу знать, как выполнить только одну операцию, если это одна и та же операция.

Это мой код для создания этих разных операций:

Op = ['+','-','*','/']
array = []
for i in Op:
    array.append(string1 + i + string2)
    return array
3
mario_nsport 9 Апр 2020 в 23:13
1
Питон не знает. Вам нужно будет реализовать такую ​​логику самостоятельно, чтобы пометить + и * как коммутативные операции, преобразовать выражения в каноническую форму и удалить дубликаты. Кроме того, 7+8*2 равнозначно 8+7*2 верно только в том случае, если вы игнорируете нормальный порядок операций.
 – 
jamesdlin
9 Апр 2020 в 23:19
1
В каком смысле "одинаковые"? Это разные строки; оцениваемые как математические выражения, они дают разные значения. Вам нужно определить свое определение «того же самого» и написать код для распознавания этих свойств. Общего пути нет. Кажется, вы спрашиваете о разработке функции, которая принимает некоторые входные выражения и возвращает логическое значение. Как научить вас, как сделать этот дизайн, так и научить вас, как написать функцию, выходят за рамки Stack Overflow.
 – 
Prune
9 Апр 2020 в 23:19
Вы можете реализовать дополнительные правила, такие как «числа в суммах и произведениях должны быть отсортированы в порядке возрастания», чтобы по крайней мере уменьшить количество «одинаковых» терминов.
 – 
Michael Butscher
9 Апр 2020 в 23:34
Не делайте возможных комбинаций с одинаковыми номерами для [ + * ] .
 – 
Nikola Lukic
9 Апр 2020 в 23:43

1 ответ

Если я вас хорошо понимаю, у меня есть идея для вас.

Прежде всего, вам нужно создать все возможные перестановки цифр и выражений. Вы можете сделать это следующим образом:

import itertools
num_list = ['2','7','8']
op = ['+','-','*','/'] * 2 # *2 for the case of same operator twice

num_perm = list(itertools.permutations(num_list))
op_perm = list(itertools.permutations(op, 2)) # We want perm of two operators.

Теперь вам нужно объединить все перестановки в математическое выражение, это хороший способ для этого:

list_of_experssions = list()
for num in num_perm :
    for op in op_perm:
        list_of_experssions.append(num[0] + op[0] + num[1] + op[1] +num[2])

Последний шаг — проверить, равны ли результаты двух выражений (используя функцию eval), но сами выражения различны:

for exp1 in list_of_experssions:
    for exp2 in list_of_experssions:
        if eval(exp1) == eval(exp2) and exp1 != exp2:
            print(exp1, exp2)

В вашем случае мы получили 336 математических выражений и 2560 пар равных выражений.

2
Yanirmr 10 Апр 2020 в 00:09
Здесь мы можем предотвратить: list_of_experssions.append(num[0] + op[0] + num[1] + op[1] +num[2]), чтобы избежать повторного цикла.
 – 
Nikola Lukic
9 Апр 2020 в 23:49
Я добавил комментарий к вашему сообщению
 – 
mario_nsport
10 Апр 2020 в 00:03
- Я исправил ошибку.
 – 
Yanirmr
10 Апр 2020 в 00:10
Если это сработает, вы можете подтвердить этот ответ, нажав на зеленый знак V. ;)
 – 
Yanirmr
10 Апр 2020 в 00:17
Я боюсь, что у этого метода есть одна проблема: он, например, будет рассматривать 7-8/2 и 2+8-7 как "дубликаты", так как они дают одно и то же значение (3), хотя разница между ними < b>не просто вопрос коммутативных операций.
 – 
Błotosmętek
10 Апр 2020 в 01:13