动态循环次数

时间:2014-11-25 15:11:21

标签: python loops dynamic

我收到一个字符串作为输入,表格如下:

x = "f(a,b) * g(b,c)"

相应的数字表达式f[a][b] * g[b][c]然后应该从a02b到{{0的所有7求和1}},c02

有了这个,我想重写下面的代码本质,这样循环(和求和的数值表达式)就会根据字符串x进行调整。

因此,使用当前的x,'硬编码'循环可能是:

t = 0
for a in range(3):
    for b in range(8):
        for c in range(3):
            t += <<insert numerical equivalent of the 
             ... f(a,b) * g(b,c) x string here, namely f[a][b] * g[b][c]>>

print t

如果是新x,例如

x = "f(a,b) * g(b,c) * g(d,c)"` 

,需要一个新的硬编码循环,现在从a02b运行0到{ {1}},7c02d0,并将表达式加7

我有逻辑构建循环变量字典及其各自的值数,基于字符串输入f[a][b] * g[b][c] * g[d][c],(x原始{'a': 3, 'b': 8, 'c': 3}和{{1}新的x - 显示为{'a': 3, 'b': 8, 'c': 3, 'd': 8}的第二个参数的字母或x的第一个参数将值fg相加,其他字母从07的总和。

02被赋予数字数组。我怎样才能拥有允许我动态执行此求和的通用代码(即一段代码适用于不同的f)?

让我用一个(希望更具解释性的)代码重述这个问题:

g

这是我奋斗的最后一件事:输入字符串s可以包含f和g的任何产品:

例如:&#34; f(a,b)* g(b,c)&#34;或&#34; f(a,b)* g(b,c)* g(d,c)&#34;,&#34; g(a,b)* f(e,a)* g( d,e)* f(e,d)&#34;等f和g是两个3x7和7x3数字阵列,分别为。代码必须求和相应的数值表达式f [a] [b] * g [b] [c],或f [a] [b] * g [b] [c] * g [d] [c],或g [a] [b] * f [e] [a] * g [d] [e] * f [e] [d],对于作为第二个参数的索引,求和的总和为0 ... 7 b和/或f的第一个参数,其他的为0 ... 2.

这是我尝试做的更好(更清晰)的表现吗?

1 个答案:

答案 0 :(得分:0)

这可以扩展到任意长链。范围应该是显而易见的,您只需传入函数映射的字典和要评估外部产品的所有术语的值。

import itertools 

def f(x,y): return x+y
def g(x,y): return 2*x-y

def outer_product_thing(F,M):
    keys = M.keys()
    ranges = [M[k] for k in keys]

    for rx in itertools.product(*ranges):
        mapping = dict(zip(keys, rx))
        value   = 1

        for func in F:
            terms =   F[func]
            value *=  func(mapping[terms[0]], 
                           mapping[terms[1]])

        print "Evaluated: ", mapping
        yield value


F = {f:("a","b"), 
     g:("b","c")}
M = {"a":range(0,2),
     "b":range(0,3),
     "c":range(0,7)}

for result in outer_product_thing(F,M):
    print result

输出(截断空间):

...
Evaluated:  {'a': 1, 'c': 0, 'b': 0}
0
Evaluated:  {'a': 1, 'c': 0, 'b': 1}
4
Evaluated:  {'a': 1, 'c': 0, 'b': 2}
12
Evaluated:  {'a': 1, 'c': 1, 'b': 0}
-1
Evaluated:  {'a': 1, 'c': 1, 'b': 1}
...