为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿晨1998 2022-06-07 16:41:38
如何在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'
查看完整描述

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;

}


查看完整回答
反对 回复 2022-06-07
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

直接使用项目列表:

for (auto x : MyBoostPythonDict.items())

我猜这iteritems可能是为了使用这样的东西:

for(auto it = D.iteritems(); it; ++it)


查看完整回答
反对 回复 2022-06-07
?
HUX布斯

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);

}

这样做的好处是它很懒,并且不会创建中间列表。


查看完整回答
反对 回复 2022-06-07
  • 3 回答
  • 0 关注
  • 436 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号