如何更改列表列表中的索引

时间:2019-02-07 16:59:58

标签: python

我想更改索引列表列表的方式。

假设我的初始列表是一个列表的两个列表和三个元素的两个列表。例如:

L = [[[1, 2, 3]], [[4, 5, 6], [7, 8, 9]]]

然后说我想在L中取'4',我必须这样做

L[1][0][0].

现在我想创建一个新列表,以使最后的索引成为第一个索引

Lnew = [[[1], [4, 7]], [[2], [5, 8]], [[3], [6, 9]]]

然后我取“ 4”就要做:

Lnew[0][1][0]

在更一般的情况下,我想创建列表Lnew定义:

Lnew[i][k][l] = L[k][l][i]

有没有一种方法可以执行这种索引排列而无需执行以下循环:

Lnew = []
for i in range(len(Payment_dates)):
    L1 = []
    for k in range(N+1):
        L2 = []
        for l in range(k+1):
            L2.append(L[k][l][i])
        L1.append(L2)
    Lnew.append(L1)

就复杂性而言,这不是最佳选择。

谢谢

1 个答案:

答案 0 :(得分:0)

您要实现的目标是,所有子列表的长度都相同。

如果它们的长度不同,则您可能希望将零添加到所有子列表,直到它们具有最长的子列表的长度为止(或者更容易)直到无限。

使用函数访问列表的元素可以实现相同的行为。您可以在运行时每次需要列表元素时调用此函数:

def getElement(myList, i, k, l):
    if k < myList.length and l < myList[k].length and i < myList[k][l].length:
        return myList[k][l][i]
    else: 
        return None # or zero, or whatever you prefer

根据您的代码结构,您可能不需要将此作为函数,而只需将条件放入代码中即可。

您还可以嵌套if条件,并根据元素不存在的级别抛出不同的错误或返回不同的值。

如果我们忽略输出多维列表元素的时间复杂度,则此方法应将您的时间复杂度从O(n ^ 3)降低为O(1)。