对python来说,(a+;b)=(b+;a)和(a*b)=(b*a)怎么样

对python来说,(a+;b)=(b+;a)和(a*b)=(b*a)怎么样,python,list,operators,Python,List,Operators,我有列表中数字之间所有可能的操作组合: 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(st

我有列表中数字之间所有可能的操作组合:

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

如果我能很好地理解你,我想我对你有个想法

首先,您需要创建所有可能的数字和表达式排列。您可以这样做:

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对相等的表达式。

Python不知道。您需要自己实现这样的逻辑,将
+
*
标记为交换操作,将表达式解析为规范形式,并删除重复项。此外,只有在忽略正常操作顺序的情况下,7+8*2与8+7*2相同才是正确的。在什么意义上“相同”?它们是不同的字符串;作为数学表达式计算,它们产生不同的值。您需要确定“相同”的定义,并编写代码来识别这些属性。没有通用的方法。您似乎在询问如何设计一个函数来接受一些输入表达式并返回布尔值。教您如何进行该设计和教您如何编写函数都超出了堆栈溢出的范围。您可以实施其他规则,如“总和和乘积中的数字必须按递增顺序排序”,以至少减少“相同”项的数量。对于[+*]不允许使用相同的数字组合。我们可以在此处阻止:
列出经验。追加(num[0]+op[0]+num[1]+op[1]+num[2])
以避免另一个循环。我在您的post@mario_nsport-我修好了程序错误。如果它有效,你可以通过点击绿色V符号来批准这个答案。恐怕这个方法有一个问题:例如,它会考虑<代码> 7-8/2 <<代码>和<代码> 2 +87-< /代码>“重复”,因为它们评估为相同的值(3),即使它们之间的差异不只是交换操作的问题。