首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python字典列表传递给Rust函数PyO3

将Python字典列表传递给Rust函数PyO3
EN

Stack Overflow用户
提问于 2021-04-10 23:28:13
回答 1查看 242关注 0票数 0

我正在尝试用rust编写一个函数,我可以从python中调用该函数,该函数接受一组字典(想像pandas dataframe一样的数据),并从rust中访问这些键和值。我如何才能做到这一点呢?我正在使用pyo3。我是否需要定义一个与python dict输入的键、值对相匹配的结构?

作为一个示例函数,我尝试传入一个字典列表,并将与键key对应的值求和为总数。我的python字典列表中的每个字典都有一个键key,它对应于一个整数。

代码语言:javascript
复制
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;
use pyo3::types::PyDict;

#[pyfunction]
fn sum_list_dicts(a: Vec<PyDict>, key: String) -> PyResult<i32> {
    let mut tot = 0_i32;

    for d in a.iter() {
        tot += d[key];
    }
    Ok(tot)
}

#[pymodule]
fn rustpy(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_list_dicts, m)?)?;

    Ok(())
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-12 02:16:48

所以这真的取决于你真正想要做什么。如果你不想弄乱实际的Py项目,你可以简单地这样做:

代码语言:javascript
复制
#[pyfunction]
fn sum_list_dicts(a: Vec<HashMap<String, i32>>, key: String) -> PyResult<i32> {
    let mut tot = 0_i32;

    for d in a.iter() {
        tot += d[&key];
    }
    Ok(tot)
}

如果你想使用PyListPyDict等,这也行得通:

代码语言:javascript
复制
#[pyfunction]
fn sum_list_dicts(a: &PyList, key: String) -> PyResult<i32> {
   let mut tot = 0_i32;

   for d in a.iter() {
       tot += d.downcast::<PyDict>()?.get_item(&key).unwrap().downcast::<PyInt>()?.extract::<i32>()?;
   }
   Ok(tot)
}

无论使用哪种方法,您都可以简单地从Python端调用它:

代码语言:javascript
复制
a = [{"ham":0, "eggs":0}, {"eggs": 1}, {"eggs": 3, "spam":2}]
b = sum_list_dicts(a, "eggs")
print(b)
>>> 4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67036103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档