Python 使用存储在另一个列表中的索引访问列表中的元素

Python 使用存储在另一个列表中的索引访问列表中的元素,python,list,Python,List,我正在寻找一种使用存储在另一个列表中的索引访问列表中元素的通用方法 例如,我有以下列表: b = [[[[[0.2], [3]], [[4.5], [78]], [[1.3], [0.23]], [[6.], [9.15]]], [[[3.1], [44]], [[1.], [66]], [[0.18], [2.3]], [[10], [7.5]]], [[[3], [4.]], [[12.3], [12]], [[7.8], [3.7]], [[1.2], [2.1]]]]] 我需要访问其索

我正在寻找一种使用存储在另一个列表中的索引访问列表中元素的通用方法

例如,我有以下列表:

b = [[[[[0.2], [3]], [[4.5], [78]], [[1.3], [0.23]], [[6.], [9.15]]],
[[[3.1], [44]], [[1.], [66]], [[0.18], [2.3]], [[10], [7.5]]],
[[[3], [4.]], [[12.3], [12]], [[7.8], [3.7]], [[1.2], [2.1]]]]]
我需要访问其索引存储在中的元素:

c = [0, 0, 0, 1, 0]
即:

3
这行不通:

b[c[0]][c[1]][c[2]][c[3]][c[4]]
因为
b
的形状会随着代码的每次运行而改变,这就是为什么我需要使用
c
的常规方法来访问
b
中的元素

比如:

b[*c]

我敢打赌这是可行的,但事实并非如此。

您可以使用递归函数。递归函数是一个调用自身的函数。在本例中,每次调用该函数时,都会降低其两个参数的维数

b = [[[[[0.2], [3]], [[4.5], [78]], [[1.3], [0.23]], [[6.], [9.15]]],
[[[3.1], [44]], [[1.], [66]], [[0.18], [2.3]], [[10], [7.5]]],
[[[3], [4.]], [[12.3], [12]], [[7.8], [3.7]], [[1.2], [2.1]]]]]

c = [0, 0, 0, 1, 0]

def getitem(arr, indices):
    if isinstance(indices, int):
        return arr[indices]
    if len(indices) == 1:
        return arr[indices[0]]
    item = indices[0]
    new_indices = indices[1:]
    return getitem(arr[item], new_indices)

print getitem(b, c) ## prints 3
使用(或与Python 3向前兼容)


这假设
keys
始终是一个列表。

b[*c]不起作用,除非你将
b
重新定义为一个对象,并重新定义它的
\uu getitem\uuuu
方法。我不喜欢这种方法,我只是认为它会起作用。使用
c
访问
b
中的元素的任何常规方法都可以。另一个答案更简单,因此我选择了它,但您向我介绍了一个我在python中不知道的概念:递归函数。谢谢
>>> def getitems(data, keys):
...     return reduce(lambda a, b: a[b], [data]+keys)
... 
>>> getitems(b, c)
3