我正在寻找使用存储在另一个列表中的索引来访问列表中元素的一般方法。
例如,我有清单:
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
来访问{{1}中的元素}}
类似的东西:
b
我敢打赌会起作用,但事实并非如此。
答案 0 :(得分:4)
使用reduce(或functools.reduce与Python 3向前兼容)
>>> def getitems(data, keys):
... return reduce(lambda a, b: a[b], [data]+keys)
...
>>> getitems(b, c)
3
这假定keys
始终是一个列表。
答案 1 :(得分:2)
您可以使用递归函数。递归函数是一个自我调用的函数。在这种情况下,每次调用函数时,我都会减少其两个参数的维度。
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