我怎样才能迭代C++在我的升压::python:字典?
我需要key and value在每个循环中。
我的尝试是这样的:
for (auto x : MyBoostPythonDict.iteritems())
{
// determine key
// determine value
// ...
}
我收到这个错误:C3312 找不到类型“boost::python::api::object”的可调用“end”函数
Boost Python 在“stl_iterator”标头中公开了一些 STL 迭代器包装器,可让您从begin
to end
就像普通的 C++ 迭代一样:
https://www.boost.org/doc/libs/1_75_0/libs/python/doc/html/reference/high_level_components/boost_python_stl_iterator_hpp.html
对于 Python 版本 2,您可以使用d.items()
or d.iteritems()
取决于您是否想要惰性迭代。对于 Python 版本 3 有一个小问题 - 你会预料到items
做一个懒人dict
视图,但 Boost Python 将其转换为列表。因此,我打电话给.attr("items")()
相反,绕过构建内转换,从而获得惰性包装器。我将此对象返回给 Python 只是为了确认它是视图而不是列表。
Calling stl_input_iterator<tuple>()
为您提供一个 (Python) 元组对象的迭代器,您可以从中提取键和值。
#include <boost/python/dict.hpp>
#include <boost/python/tuple.hpp>
#include <boost/python/stl_iterator.hpp>
#include <boost/python/extract.hpp>
#include <boost/python/str.hpp>
#include <boost/python.hpp>
#include <iostream>
using namespace boost::python;
object print_dict_to_cout(dict d) {
auto items = d.attr("items")(); // just plain d.items or d.iteritems for Python 2!
for (auto it = stl_input_iterator<tuple>(items); it != stl_input_iterator<tuple>(); ++it) {
tuple kv = *it;
auto key = kv[0];
auto value = kv[1];
std::cout << extract<const char*>(str(key)) << " : " << extract<const char*>(str(value)) << std::endl;
}
return items;
}
BOOST_PYTHON_MODULE(iterdict)
{
def("print_dict_to_cout", print_dict_to_cout);
}
这样做的优点是它很懒,并且不会创建中间列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)