在Python中为2个不同变量初始化2D数组/列表

2024-10-01 19:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一些东西从Java移植到Python,我很好奇如何转换这个方法。它用于初始化具有2个不同变量的2D数组。以下是Java中的代码:

private void initialiseQvalues() {
    qTable = new float[numStates][numActions];
    // set q values initially to 0
    for (int i = 0; i < numStates; i++) {
        for (int j = 0; j < numActions; j++) {
            qTable[i][j] = 0.0f;
        }
    }
}

我通过这个函数将其带到Python中:

def initialiseQvalues(self, numStates, numActions):
    self.qTable = [numStates][numActions]

    for i in range(0, numStates):
        for j in range(0, numActions):
            self.qTable[i][j] = 0.0

但是,我得到以下错误:

File "C:\Users\ninja\OneDrive\Desktop\Stuff\FYP\Gridworld\Agent.py", line 27, in initialiseQvalues
    self.qTable = [numStates][numActions]
IndexError: list index out of range

我读过关于列表压缩和其他2D数组的方法,但是对于具有两个不同变量(NumStates、numActions)的2D数组,我没有看到任何东西


Tags: 方法代码inselfforrange数组java
2条回答

Python使用列表进行正常处理,这些列表接近Java ArrayList对象。因此,您只需初始化一个包含numStates(子)列表的列表,每个列表都包含numActions操作。如果使用显式循环,则附加到列表要比直接构建列表列表容易得多。因此,您可以使用:

def initialiseQvalues(self, numStates, numActions):
    self.qTable = []

    for i in range(0, numStates):
        self.qTable.append([])
        for j in range(0, numActions):
            self.qTable[i].append(0.0)

但真正的Python方式是使用理解:

def initialiseQvalues(self, numStates, numActions):
    return [[0.0 for j in range(numActions)] for i in range(numStates]

Python有一个包含列表列表的初学者陷阱(或者更一般地说是包含可变对象的容器):朴素的[[0.0] * numStates] * numActions]生成一个包含对同一对象的引用的外部列表。演示:

>>> tab = [[0.0] * 3] * 2
>>> tab
[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
>>> tab[0][0] = 1.0
>>> tab
[[1.0, 0.0, 0.0], [1.0, 0.0, 0.0]]

更改子列表中的元素会更改所有其他子列表中的相同元素,因为外部列表只包含对同一内部对象的一组引用

为了初始化n重复值列表,可以使用乘法运算符,如下所示:

    def initialiseQvalues(self, numStates, numActions):
        self.qTable = [[0.0 for i in range(numActions)] for j in range(numStates)]

相关问题 更多 >

    热门问题