我在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]
也不起作用。不确定为什么。
修改
人们误解了我在这里尝试做的事情,所以让我解释一下。这是在已定义值x
,y
,t
的函数内部。但是,应该由用户提供应用这些索引的顺序。所以这个电话就像是func(order='t,x,y')
。这至少是我认为用户可以将索引的 order 作为参数传递的唯一方式。对不起,感到困惑。
答案 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_
索引数组。