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

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)

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)建中間列表。
添加回答
舉報(bào)