如何迭代 (key, value) boost::python:dict

如何在C++中迭代我的boost::python:dict?我在每一轮循环中都需要键和值。


我的尝试是这样的:


for (auto x : MyBoostPythonDict.iteritems())

{

    // determine key

    // determine value 

    // ...

}

我收到此错误: C3312 no callable 'end' function found for type 'boost::python::api::object'


阿晨1998
浏览 438回答 3
3回答

元芳怎么了

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

汪汪一只猫

直接使用项目列表:for&nbsp;(auto&nbsp;x&nbsp;:&nbsp;MyBoostPythonDict.items())我猜这iteritems可能是为了使用这样的东西:for(auto&nbsp;it&nbsp;=&nbsp;D.iteritems();&nbsp;it;&nbsp;++it)

HUX布斯

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) {&nbsp; &nbsp; auto items = d.attr("items")(); // just plain d.items or d.iteritems for Python 2!&nbsp; &nbsp; for (auto it = stl_input_iterator<tuple>(items); it != stl_input_iterator<tuple>(); ++it) {&nbsp; &nbsp; &nbsp; &nbsp; tuple kv = *it;&nbsp; &nbsp; &nbsp; &nbsp; auto key = kv[0];&nbsp; &nbsp; &nbsp; &nbsp; auto value = kv[1];&nbsp; &nbsp; &nbsp; &nbsp; std::cout << extract<const char*>(str(key)) << " : " << extract<const char*>(str(value)) << std::endl;&nbsp; &nbsp; }&nbsp; &nbsp; return items;}BOOST_PYTHON_MODULE(iterdict){&nbsp; &nbsp; def("print_dict_to_cout", print_dict_to_cout);}这样做的好处是它很懒,并且不会创建中间列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python