如何迭代(键,值)提升::p ython:dict
How iterate (key, value) boost::python:dict
如何在C++中迭代我的boost::p ython:dict? 我需要在每个循环中键和值。
我的尝试是这样的:
for (auto x : MyBoostPythonDict.iteritems())
{
// determine key
// determine value
// ...
}
我收到此错误:C3312 找不到类型"boost::p ython::api::object"的可调用"结束"函数
Boost Python在"stl_iterator"标头中公开了一些STL迭代器包装器,让你像普通的C++迭代一样从begin
到end
:
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);
}
这样做的好处是它是懒惰的,并且不会创建中间列表。
您可以简单地遍历所有键/值对,如下所示:
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;
}
直接使用项目列表:
for (auto x : MyBoostPythonDict.items())
我猜iteritems
可能打算像这样使用:
for(auto it = D.iteritems(); it; ++it)
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 提升 ASIO 无法识别计时器对象
- 提升精神:解析布尔表达式并简化为规范范式
- 如何克服提升精神AST混乱
- 缓慢提升ASIO
- 我可以把基础班提升为儿童班吗
- 提升反序列化对象具有 nan 或 -nan 值
- 在 Mac 上的 python 上提升
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- 提升 Asio TCP 服务器 处理多个客户端
- 使用提升将数据从 PyObject 复制到浮点数 *
- 如何迭代(键,值)提升::p ython:dict
- 提升::p ython 和特征/密集创建分割错误
- 在提升::p ython::导入( "cv2" 上得到异常提升::p ython::error_already_set
- 可以提升::p ython将对象的所有权传递给python回调函数
- 与提升相反::p ython::extract<obj>
- 意外结果迭代提升::p ython vector_indexing_suite
- 带提升功能的 Scipy::p ython 函数
- 迭代提升时出现类型错误::p ython 向量
- 提升::p ython 受保护的析构函数问题