3 回答

TA贡献1798条经验 获得超7个赞
您可以简单地遍历所有键/值对,如下所示:
using namespace boost::python;
list items = MyBoostPythonDict.items();
for(ssize_t i = 0; i < len(items); ++i) {
object key = items[i][0];
object value = items[i][1];
// ...
}
现在您需要从key和中提取相应的类型value。假设两者都是int您将使用的类型:
extract<int> key_int(key);
extract<int> value_int(value);
if (key_int.check() && value_int.check()) {
cout << key_int << ": " << value_int << endl;
}

TA贡献1898条经验 获得超8个赞
直接使用项目列表:
for (auto x : MyBoostPythonDict.items())
我猜这iteritems
可能是为了使用这样的东西:
for(auto it = D.iteritems(); it; ++it)

TA贡献1876条经验 获得超6个赞
Boost Python 在“stl_iterator”标头中公开了一些 STL 迭代器包装器,让您可以begin像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()或d.iteritems()取决于您是否要延迟迭代。对于 Python 版本 3 有一个小问题 - 您希望items是一个惰性dict视图,但 Boost Python 将其转换为一个列表。因此,我.attr("items")()改为绕过内置转换,从而得到一个惰性包装器。我已将此对象返回给 Python,只是为了确认它是视图而不是列表。
调用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);
}
这样做的好处是它很懒,并且不会创建中间列表。
添加回答
举报