我收到一个字符串作为输入,表格如下:
x = "f(a,b) * g(b,c)"
相应的数字表达式f[a][b] * g[b][c]
然后应该从a
到0
,2
从b
到{{0
的所有7
求和1}},c
从0
到2
。
有了这个,我想重写下面的代码本质,这样循环(和求和的数值表达式)就会根据字符串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)"`
,需要一个新的硬编码循环,现在从a
到0
,2
从b
运行0
到{ {1}},7
从c
到0
和2
从d
到0
,并将表达式加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
的第一个参数将值f
和g
相加,其他字母从0
到7
的总和。
0
和2
被赋予数字数组。我怎样才能拥有允许我动态执行此求和的通用代码(即一段代码适用于不同的f
)?
g
这是我尝试做的更好(更清晰)的表现吗?
答案 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}
...