Python中的动态多维列表

时间:2019-05-18 12:44:14

标签: python arrays multidimensional-array

我想创建一个函数,该函数可以将给定值插入给定数组的给定索引中。二维数组非常简单:

def insertInto(index, array, value):
    are index in array?
        no:
            iterate over range (len(array) -> index):
                insert None into array
    insert value into array
    return array

但是,如果我想对多维索引做同样的事情,怎么办?

假设我们的开头是arr = []。然后,在执行insertInto((0,0,2), arr, 'yey')后,给定的arr应该看起来像[[[None, None, 'yey']]]arr[0][0][2] == 'yey'

我试图实现这种功能,但是很难进入新的维度级别。我的想法是:

def insertInto(index: tuple, array, value):
    currentCoordinate = index.pop(0)
    currentLevel = array[currentCoordinate]
    while index:  # while len(index) > 0
        if size(array[i]) < currentCoordinate:
            currentLevel = enlargeList(currentLevel, currentCoordinate)
            # enlargeList function enlarge the given list, so it will
            # have required index. the gaps will be filled with None
            # example: enlargeList([1], 3) == [1, None, None, None]
        currentLevel[currentCoordinate] = []
        currentLevel = currentLevel[currentCoordinate]
        # in the next iteration currentLevel variable will be equal to
        # inserted list
        currenCoordinate = index.pop(0)

此解决方案的问题非常明显:我无法分配(例如)a = l[0](其中l是列表,而a是一些临时变量),然后修改{ {1}},因为它不会影响a(请参阅this question)。

有人知道如何用另一种方法吗?

此代码应不需要任何库。

1 个答案:

答案 0 :(得分:1)

简化问题的一种方法是使用递归函数。这样,变量将保留在范围内,并且不应相互擦除。

为简单起见,我确实使用了(index, *tail)而不是基于元组的索引

def ensure_array_index(array, index):
    while len(array) <= index:
        array.append(None)
    if array[index] is None:
        array[index] = []

def insert_into(array, value, index, *tail):
    ensure_array_index(array, index)
    if len(tail) == 0:
        array[index] = value
    else:
        insert_into(array[index], value, *tail)


arr = []
insert_into(arr, '001', 0, 0, 1)
insert_into(arr, '011', 0, 1, 1)
insert_into(arr, '211', 2, 1, 1)
insert_into(arr, '1', 1)
print arr

>>> [[[None, '001'], [None, '011']], '1', [None, [None, '211']]]

唯一的缺点是您受到可插入深度(〜100 afaik)的python调用栈的限制