首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++,python解决思路

2013-07-11 
c++,pythonc++中怎样读取python文件中多个字典的key和value值,并且字典中的key值(一个key中有多个值)有数

c++,python
c++中怎样读取python文件中多个字典的key和value值,并且字典中的key值(一个key中有多个值)有数字类型和字符串类型的?
比如python中的cal.py文件代码如下:
def mix():
#key中有数字类型和字符串类型的
      r={(1,'b','c'):'1aaaaa',
         (2,'c','d'):'2bbbbb',
         (3,'d','e'):'3ccccc'
         }
      n={(1,'b'):'1qqqqq',
         (2,'c'):'2wwwww',
         (3,'d'):'3eeeee'
         }
 return r,n
 c++中代码如下:

        Py_Initialize();
PyObject * pModule =NULL , *first = NULL, *pDict = NULL;
pModule = PyImport_ImportModule("cal");
first = PyObject_GetAttrString(pModule,"mix");
PyObject * pyValue = PyObject_CallFunction(first, NULL);

PyObject *key_dict = PyDict_Keys(pyValue); //return PyListObject 
size_t len=PyDict_Size(pyValue);
for(size_t i=0;i<len;++i)
{
PyObject *key = PyList_GetItem(key_dict, i); // 返回元组

size_t lent3 = PyTuple_GET_SIZE(key);
for (size_t k=0;k<lent3;++k)
{
   if(PyInt_Check(keylist3))
                     {
                        long key3 = PyInt_AsLong(keylist3);
                        cout<<key3<<endl;
                      }
                   if(PyString_Check(keylist3))
                     {
                        string key3 = PyString_AsString(keylist3);
                        cout<<key3<<endl;
                     }



         }

PyObject *value = PyDict_GetItem( pyValue, key); //查询value
string cval = PyString_AsString(value); //转换结果
//string s = PyString_AsString(key);
cout<<cval<<endl;

Py_Finalize();
system("pause");
return 0 ;
这样判断key的类型为什么不对?还要怎样获得两个字典的key和value值????

        Python C++
[解决办法]
判断类型并没有错, 只是你的遍历少了一层而出错:


Py_Initialize();
PyObject * pModule =NULL , *first = NULL, *pDict = NULL;
pModule = PyImport_ImportModule("cal");
first = PyObject_GetAttrString(pModule,"mix");
PyObject * pyValue = PyObject_CallFunction(first, NULL); // 如果 Python 的函数返回多个值, 则返回的类型其实是元组, 所以还需要多一层来遍历每一个返回值.

size_t retCount = PyTuple_GET_SIZE(pyValue);
for(size_t r = 0; r < retCount; ++r)
{
PyObject* pyDict = PyTuple_GetItem(pyValue, r); // 每一个返回值都是字典
PyObject *key_dict = PyDict_Keys(pyDict); //return PyListObject 
size_t dictLen = PyDict_Size(pyDict);
for(size_t i = 0; i < dictLen; ++i)  // 遍历字典的每一个元素
{
PyObject* key = PyList_GetItem(key_dict, i);
size_t lent3 = PyTuple_GET_SIZE(key);
for (size_t k = 0; k < lent3; ++k)
{
PyObject * keylist3 = PyTuple_GetItem(key, k);
if(PyInt_Check(keylist3))
{
long key3 = PyInt_AsLong(keylist3);
cout<<key3<<endl;
}
if(PyString_Check(keylist3))
{
string key3 = PyString_AsString(keylist3);
cout<<key3<<endl;
}
}

PyObject *value = PyDict_GetItem( pyDict, key); //查询value
string cval = PyString_AsString(value); //转换结果
cout<<cval<<endl;


}
}

Py_Finalize();

热点排行