2015-04-01 1317 views
2

我有一个多维列表F,它包含某种类型的元素。所以,如果例如等级是4,那么F的元素可以通过诸如F[a][b][c][d]之类的东西来访问。我想访问F[a][b][c][d]。我的问题是我的排名将会改变,所以我不能只有F[L[0]][L[1]][L[2]][L[3]]Python:访问多维列表的元素,给出一个索引列表

理想情况下,我希望能够做到F[L]并获得元素F[a][b][c][d]。我认为这样的事情可以用numpy来完成,但对于我使用的数组类型,numpy并不合适,所以我想用python列表来完成。

我怎么能有类似上面的东西?

编辑:有关我想要实现的具体示例,请参阅Martijn答案中的演示。

+0

我知道我的问题看起来有点草率。我还没有设法找到一种更好的表达方式。 – geo909 2015-04-01 16:14:45

+0

我也发现这:https://stackoverflow.com/questions/7789143/dynamic-access-of-multi-dimensional-python-array然而,它不是重复的,因为它只谈论numpy数组.. – geo909 2015-04-01 16:15:11

+3

你可以通过给出样本输入和预期输出 – thefourtheye 2015-04-01 16:15:17

回答

7

可以使用reduce() function访问连续元素:

from functools import reduce # forward compatibility 
import operator 

reduce(operator.getitem, indices, somelist) 

在Python 3 reduce被移到了functools模块,但在Python 2.6和高达你可以随时访问该位置。

以上使用operator.getitem() function将每个索引应用于以前的结果(从somelist开始)。

演示:

>>> import operator 
>>> somelist = ['index0', ['index10', 'index11', ['index120', 'index121', ['index1220']]]] 
>>> indices = [1, 2, 2, 0] 
>>> reduce(operator.getitem, indices, somelist) 
'index1220' 
2

像这样的事情?

def get_element(lst, indices): 
    if indices: 
     return get_element(lst[indices[0]], indices[1:]) 
    return lst 

测试:

get_element([[["element1"]], [["element2"]], "element3"], [2]) 
'element3' 
get_element([[["element1"]], [["element2"]], "element3"], [0, 0]) 
['element1'] 

或者,如果你想要一个迭代版本:

def get_element(lst, indices): 
    res = lst 
    for index in indices: 
     res = res[index] 
    return res 

测试:

get_element([[["element1"]], [["element2"]], "element3"], [1, 0]) 
['element2'] 
相关问题