Foreword
嵌套循环本身并不是一件坏事。它们只有在用于解决已找到更好算法的问题时才是坏的(就输入大小的效率而言,有好有坏)。例如,对整数列表进行排序就是这样一个问题。
分析问题
The size
在上面的例子中,您有三个列表,大小均为 4。如果 a 始终位于 b 之前且 b 始终位于 c 之前,则这将产生 4 * 4 * 4 = 64 种可能的组合。所以你至少需要 64 次迭代!
你的方法
在您的方法中,我们对 a 的每个可能值进行 4 次迭代,对 b 的每个可能值进行 4 次迭代,对 c 进行同样的迭代。所以我们总共有 4 * 4 * 4 = 64 次迭代。所以事实上你的解决方案非常好!
由于没有更快的方法来收听所有组合,因此您的方法也是最好的方法。
样式
关于样式,可以说您可以通过更好的变量名称和组合一些 for 循环来改进代码。例如。像那样:
def replaceVar(expressions):
"""
Takes a list of expressions and returns a list of expressions with
evaluated variables.
"""
evaluatedExpressions = list()
valuesOfA = [1, 8, 12, 13]
valuesOfB = [1, 2, 3, 4]
valuesOfC = [5, 9, 2, 7]
for expression in expressions:
for valueOfA in valuesOfA:
for valueOfB in valuesOfB:
for valueOfC in valuesOfC:
newExpression = expression.\
replace('a', str(valueOfA)).\
replace('b', str(valueOfB)).\
replace('c', str(valueOfC))
evaluatedExpressions.append(newExpression)
print(evaluatedExpressions)
return evaluatedExpressions
print(replaceVar(['b-16+(c-(a+11))', 'a-(c-5)+a-b-10']))
但请注意,迭代次数保持不变!
迭代工具
As Kevin注意到,你也可以使用itertools
生成笛卡尔积。在内部,它将执行与组合 for 循环相同的操作:
import itertools
def replaceVar(expressions):
"""
Takes a list of expressions and returns a list of expressions with
evaluated variables.
"""
evaluatedExpressions = list()
valuesOfA = [1, 8, 12, 13]
valuesOfB = [1, 2, 3, 4]
valuesOfC = [5, 9, 2, 7]
for expression in expressions:
for values in itertools.product(valuesOfA, valuesOfB, valuesOfC):
valueOfA = values[0]
valueOfB = values[1]
valueOfC = values[2]
newExpression = expression.\
replace('a', str(valueOfA)).\
replace('b', str(valueOfB)).\
replace('c', str(valueOfC))
evaluatedExpressions.append(newExpression)
print(evaluatedExpressions)
return evaluatedExpressions
print(replaceVar(['b-16+(c-(a+11))', 'a-(c-5)+a-b-10']))