Python:如何使用字符串索引('[0] [1] [0]')作为多维数组的索引

时间:2017-03-03 19:54:14

标签: python arrays multidimensional-array indexing eval

我想使用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()解决方案。

1 个答案:

答案 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