读取字符串作为等式中的文本

时间:2016-08-18 23:37:28

标签: python string for-loop text

我希望能够执行以下代码:

import numpy
z=numpy.zeros(4)
k="z[i-1]"
for i in range(len(b)):
    z[i]=k

哪个应返回相同的输出:

z=numpy.zeros(4)
for i in range(6):
    z[i]=z[i-1]

如果我执行第一个代码块,则会收到预期的错误消息:

  File "<ipython-input-982-3ba4e617a74a>", line 1, in <module>
    z[i]=(k)

ValueError: could not convert string to float: 'z[i-1]'

如何将字符串中的文本传递给循环以使其作为等式运行,就像字符串中的字符是手工输入一样?

3 个答案:

答案 0 :(得分:3)

我认为您正在寻找builtin eval()

考虑:

>>> z = numpy.zeros(4)
>>> k = "10 + z[i-1]"
>>> for i in range(1, 4):
...     z[i] = eval(k)
...
>>> z
array([  0.,  10.,  20.,  30.])

我使表达式更复杂,因此您可以看到有趣的输出。

答案 1 :(得分:1)

执行以下操作:

import numpy
z=numpy.zeros(4)
k="z[i-1]"
for i in range(len(b)):
    z[i]=eval(k)

但请注意,eval可能是一个安全问题:http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

答案 2 :(得分:1)

生产代码中非常不鼓励使用eval以外的其他内容,您可以轻松定义一个基于数组和索引返回特定项的函数:

def k(arr,idx):
    return arr[idx-1]
for i in range(len(b)):
    z[i]= k(z,i)

如果需要在代码中的不同位置应用此规则,则可以编辑一个函数以将该逻辑应用于所需的所有位置。