我想使用String:'[0][1][0]'
作为多维数组的索引。如果我编写代码myarray[0][1][0]
,我会从第一个项目的第一个孩子获得内容,并且它是第二个孩子([0][1][0]
)。
仍然有效:
myarray = [
[
'child 0',
[
'child 0,0',
[
'child 0,0,0'
]
'child 0,1',
[
'child 0,1,0'
]
]
],
[
'child 1',
[
'child 1,0',
'child 1,1'
],
[
'child 2',
[
'child 2,0'
]
]
]
print myarray[0][1][0] # >> prints: "child 0,1,0"
这不能确定:
# use same array as above (myarray)
sindex='[0][1][0]'
print myarray[sindex] # should print: "child 0,1,0" but results in "KeyError: '[0][1][0]'"
修改
从下面的评论中了解到(感谢大家!),了解sindex
的长度可能会有所不同,例如'[1][0][2]'
或'[2][1][4][2][0]'
。
编辑II:
正如我所知,改变 Brian的解决方案
并不容易def get_index_from_string(arr, idx_string):
i = [int(i) for i in idx_string[1:-1].split('][')]
res = arr[:]
for x in i:
res = res[x]
return res
能够使用myarray[0][1].pop(0)
从数组中删除Item,他只是吐出节点值而不是指向它。解决方案可能是通过对它进行重建来重建数组,但这是不可能的,因为它继承了我必须解析的多个不同的类型,然后在没有Node Brian的函数查找的情况下完全重建一个副本。
Leon的解决方案
from functools import reduce
import operator
reduce(operator.getitem, sindex, myarray)
我没有想法如何使用Reduce
将其转换为pop()
解决方案。
答案 0 :(得分:1)
这看起来像是一个XY问题:索引最终是如何在字符串中出现的?在我看来,你可以更好地存储这些信息。
当然没有内置函数来解析表示索引的字符串。我建议首先解析字符串中的索引然后正常进行。
对于二维列表,这可能如下所示:
>>> my_array = [[1, 2], [3, 4]]
>>> sindex = '[1][0]'
>>> y, x = [int(i) for i in sindex[1:-1].split('][')]
>>> my_array[y][x]
3
或者,你可以使用eval
,但eval
is evil,所以我不会告诉你如何做到这一点。
编辑:
如果您需要一个可以处理可变长度的函数,请尝试以下操作。 (同样,实际问题可能是上游。)这个函数非常难看,需要原始数组的副本:
>>> def get_index_from_string(arr, idx_string):
... i = [int(i) for i in idx_string[1:-1].split('][')]
... res = arr[:]
... for x in i:
... res = res[x]
... return res
...
>>> my_arr = [1, 2, 3]
>>> my_arr2 = [[1,2],[3,4]]
>>> my_arr3 = [[[1,2],[3,4]],[[5,6],[7,8]]]
>>> get_index_from_string(my_arr, '[1]')
2
>>> get_index_from_string(my_arr2, '[1][0]')
3
>>> get_index_from_string(my_arr3, '[1][0][1]')
6