Python 到 C++ 的字典列表

Posted

技术标签:

【中文标题】Python 到 C++ 的字典列表【英文标题】:Python List of Dictionaries to C++ 【发布时间】:2019-12-27 10:13:23 【问题描述】:

我有一个 Python 字典列表,我想将其翻译成 C++。

我的列表或多或少是这样的:

myList = ["v_A": 5, "v_B": 3, "v_A": 1, "v_B":2, "v_A":0, "v_B": 0]

我的代码是这样设计的,当我寻找例如粒子0的速度,我知道:

v = myList[0]["v_"+letter]

其中letter 将是一个字符串"A""B",这取决于我拥有的排序函数的输出。我发现这是在 Python 中实现我的目的最方便的方法。

我正在尝试将我的代码翻译成 C++(有点新手),但我不知道如何保留类似“字典”的功能(即,通过可以构建的键访问值连接字符串)以及列表的好处,如myList

我没有成功阅读这个问题,无法理解:C++ Equivalent of Python List of Dictionaries?

经过一些研究,我想到了使用无序地图的向量,但我不确定如何定义它并使用它。我想到了:

vector< unordered_map <string, int >> myList;

但是,我总是遇到错误。此外,我不知道如何在字典中引入值或访问元素。我是从一个完全错误的角度来处理这个问题吗?

编辑: 我发现如果我逐段定义和插入元素,它似乎可以工作:

std::vector <unordered_map <string, int> > myList;
unordered_map <string, int> tempMap;
tempMap.insert(std::make_pair("v_A", 10));
myList.push_back(tempMap);
cout << myList[0]["v_A"];

正确返回10。有没有办法以更有效/更简单的方式做到这一点?

【问题讨论】:

什么错误?用什么代码?请提供minimal reproducible example 以显示您到目前为止所做的尝试 请说明您尝试了什么以及这些错误是什么。虽然尚不清楚这是否是 C++ 中解决问题的最佳方法,但您展示的定义应该可以工作,并且几乎可以像在 Python 中一样使用。 【参考方案1】:

在列表中插入可以更简单。

在初始化时你可以这样做

std::vector<std::unordered_map<std::string, int>> myList 
    "v_A", 5, "v_B", 3,
    "v_A", 1, "v_B", 2,
    "v_A", 0, "v_B", 0
;

您稍后可以使用push_back 增加向量的大小:

myList.push_back("v_A", 0, "v_B", 0);

或者您可以使用与 python 相同的方式将现有元素之一添加到字典中:

myList[0]["v_C"] = 12;

您不能以这种方式将元素添加到向量中。 (越界访问向量会导致未定义的行为。)

可以使用myList[0]["v_C"] 像在 Python 中一样读取元素。

您不能像v = myList[0]["v_"+letter] 那样直接使用+ 将字符或C 样式字符串连接到字符串文字(取决于letter 的类型,它可能会编译,但可能不会按照您的预期执行) .但是如果你使用

using namespace std::string_literals;

在您的.cpp 文件中包含之后,您可以编写

v = myList[0]["v_"s+letter];

s 后缀随后会将字符串文字转换为 std::string,它提供了一个实际执行连接的 + 运算符。

【讨论】:

感谢您提供有关如何添加字符串的建议!很有帮助!【参考方案2】:

使用std::unordered_map,您可以使用operator[],如果该元素不存在,它将被插入到地图中。

这不适用于向量。向量是一个动态数组,您需要先向其中显式添加元素,然后才能使用operator[] 访问已添加的元素。

std::vector<std::unordered_map<std::string, int>> myList;
myList[0]; // Invalid since the vector currently is empty.

myList.push_back(); // Insert a default-constructed element in the vector

myList[0]; // Refers to the first element in the vector, which is a std::unordered_map<std::string, int>

myList[0]["string"] = 1; // This will create the elements if it does not already exist at mentioned above so this works fine

如果您知道希望向量具有的大小,可以使用std::vector::resize 或调用构造函数来设置大小。

std::vector<std::unordered_map<std::string, int>> myList(10);
// Create a vector with 10 elements, so [0-9] would be in-bounds.

std::vector<std::unordered_map<std::string, int>> myList;
myList.resize(10); // This will do the same thing but in two steps.

【讨论】:

以后我会牢记这一点,谢谢您的建议!【参考方案3】:
std::vector<std::unordered_map<std::string, int>> dictList; // This is a list of dicts

std::unordered_map<std::string, int> dict; // Here we create a specific dict we want to add to our list of dicts

dict["key"] = 10; // This is how you add (key, value) pair into dict in c++

dictList.push_back(dict); // This is how you add your dict to the list of dicts

【讨论】:

最好使用push_back(std::move(dict)) — 或者使用dictList.emplace_back() 创建一个新的空地图向量中,然后在那里填充它。

以上是关于Python 到 C++ 的字典列表的主要内容,如果未能解决你的问题,请参考以下文章

python中列表元组字典简单介绍

C++中python dict和tr1::unordered_map的区别

添加到字典列表 - python

将 Python 字典排列组合到字典列表中

在python中怎么把列表中的元素添加到字典中

Python之列表元组字典集合及字符串的详细使用