第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

阿晨1998 2022-06-07 16:41:38
如何在C++中迭代我的boost::python:dict?我在每一輪循環(huán)中都需要鍵和值。我的嘗試是這樣的:for (auto x : MyBoostPythonDict.iteritems()){    // determine key    // determine value     // ...}我收到此錯(cuò)誤: C3312 no callable 'end' function found for type 'boost::python::api::object'
查看完整描述

3 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

您可以簡單地遍歷所有鍵/值對(duì),如下所示:


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

    // ...

}

現(xiàn)在您需要從key和中提取相應(yīng)的類型value。假設(shè)兩者都是int您將使用的類型:


extract<int> key_int(key);

extract<int> value_int(value);


if (key_int.check() && value_int.check()) {

    cout << key_int << ": " << value_int << endl;

}


查看完整回答
反對(duì) 回復(fù) 2022-06-07
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

直接使用項(xiàng)目列表:

for (auto x : MyBoostPythonDict.items())

我猜這iteritems可能是為了使用這樣的東西:

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


查看完整回答
反對(duì) 回復(fù) 2022-06-07
?
HUX布斯

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊

Boost Python 在“stl_iterator”標(biāo)頭中公開了一些 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


對(duì)于 Python 版本 2,您可以使用d.items()或d.iteritems()取決于您是否要延遲迭代。對(duì)于 Python 版本 3 有一個(gè)小問題 - 您希望items是一個(gè)惰性dict視圖,但 Boost Python 將其轉(zhuǎn)換為一個(gè)列表。因此,我.attr("items")()改為繞過內(nèi)置轉(zhuǎn)換,從而得到一個(gè)惰性包裝器。我已將此對(duì)象返回給 Python,只是為了確認(rèn)它是視圖而不是列表。


調(diào)用stl_input_iterator<tuple>()為您提供了一個(gè) (Python) 元組對(duì)象的迭代器,您可以從中提取鍵和值。


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

}

這樣做的好處是它很懶,并且不會(huì)創(chuàng)建中間列表。


查看完整回答
反對(duì) 回復(fù) 2022-06-07
  • 3 回答
  • 0 關(guān)注
  • 393 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)