私はPython 3.5モジュールをC++で書いています.2DリストをPythonからC++に、好ましくはstd :: vectorにフィードしたいと思います。作業コードは以下の通りですが、データのコピーを避け、2次元配列をアドレス& input_valueにポイントすることを期待していました。これを行うより良い方法はありますか?2d pythonリストをC++拡張モジュールに効率的に与える方法
PyObject* CheckTerminal(PyObject* self, PyObject* args)
{
PyObject *input_value;
std::vector<std::vector<bool>> cArray;
if (!PyArg_ParseTuple(args, "O", &input_value))
{
std::cout << "\nerror\n";
goto error;
}
int count = (int)PyList_Size(input_value);
PyObject *ptemp,*vals;
for (int i = 0; i < count; i++)
{
cArray.push_back(std::vector<bool>());
ptemp = PyList_GetItem(input_value, i);
int count2 = (int)PyList_Size(ptemp);
for (int j = 0; j < count2; ++j)
{
vals = PyList_GetItem(ptemp, j);
int v = PyLong_AsLong(vals);
if (v == 1)
{
cArray[i].push_back(true);
}
else if (v == 0)
{
cArray[i].push_back(false);
}
}
}
return PyBool_FromLong(g.CheckTerminal(&cArray));
error:
return 0;
}
このモジュールをインポートした後、私はこれをpythonから呼び出します。
p=[[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]]
print(nInARow.CheckTerminal(p))
問題は、Pythonリストは値の配列ではなく、配列の配列であることです。 –