eval评估为元组

时间:2015-05-20 12:37:36

标签: python matrix

我在python中有三个索引x,y,t和一个三维矩阵(它实际上是一个netcdf变量),但索引必须应用于矩阵的顺序发生变化。因此,为了使用户可以轻松定义,我试图获得我想要的特定元素

order='t,x,y'  # or 't,y,x' or anything like this
elem=matrix[eval(order)]

但是TypeError: illegal subscript type失败了。当我尝试

a=eval(order)
print type(a)

它告诉我a是一个元组,所以我猜这是我问题的根源。但为什么a是一个元组?任何想法如何做到这一点?文档没有帮助。

另外,不知怎的做着

a=eval(order)
i,j,k=a
elem=matrix[i,j,k]

也不起作用。不确定为什么。

修改

人们误解了我在这里尝试做的事情,所以让我解释一下。这是在已定义值xyt的函数内部。但是,应该由用户提供应用这些索引的顺序。所以这个电话就像是func(order='t,x,y')。这至少是我认为用户可以将索引的 order 作为参数传递的唯一方式。对不起,感到困惑。

3 个答案:

答案 0 :(得分:1)

为什么a是一个元组?

因为它是:如果您将eval()从图片中删除,那么当您只使用逗号时,您会得到相同的结果:

>>> a = 1, 2, 3
>>> type(a)
<type 'tuple'>

请改为:

直接将订单作为列表,列表维护订单:

def some_method(order=None):
    order = order or [t, y, x]  
    # t, y, x have to be known out side this scope         
    ...

如果您的t, x, y仅在范围内知道,那么您 - 当然 - 必须这样做 以符号的方式给出订单,从而回到eval。在这里,您将了解有关函数内部状态的知识

def some_method(order='t,x,y'):
    order = eval(order)
    ...
    elem = matrix[order[0]][order[1]][order[2]]

修改

wims answer显示当此函数的输入来自不受信任的来源时,如何避免eval()哪个应该首选 ,因为eval()会很高兴运行任意python代码。

答案 1 :(得分:0)

我认为您正在寻找的内容被称为&#34;切片&#34;,甚至&#34;扩展切片&#34;,具体取决于您要切片的数据格式。哦,你根本不需要eval,元组就可以了。

另见这个问题: Explain Python's slice notation

答案 2 :(得分:0)

您应该尽量避免使用eval。这很丑陋,很容易通过查找词汇来避免它。

>>> order = 'x,y,t'  # this is specified outside your function

如果需要,您仍然可以将此字符串传递给您的函数:

>>> # this is inside your function:
>>> t,x,y = 0,1,2  # I don't know what your actual values are..
>>> lookup = {'t': t, 'x': x, 'y': y}  # make this inside your function
>>> tuple_ = tuple(lookup[k] for k in order.split(','))  
>>> tuple_
(1, 2, 0)

现在使用tuple_索引数组。

相关问题