如何在 C++ 中展平字典

Posted

技术标签:

【中文标题】如何在 C++ 中展平字典【英文标题】:How do I flatten a dictionary in c++ 【发布时间】:2018-10-26 00:38:25 【问题描述】:

我怎样才能展平下面的字典-

输入:

dict = 
            "Key1" : "1",
            "Key2" : 
                "a" : "2",
                "b" : "3",
                "c" : 
                    "d" : "3",
                    "e" : 
                        "" : "1"
                    
                
            
        

输出:


            "Key1" : "1",
            "Key2.a" : "2",
            "Key2.b" : "3",
            "Key2.c.d" : "3",
            "Key2.c.e" : "1"
        

输入映射的数据类型是map<string, void*> 预期的输出映射为map<string,string>

【问题讨论】:

首先不要使用void*。您无法使用这些指针指向的对象。 输入是分层的,输入map的类型怎么可能是map<string, void*>呢?请发布一些 C++ 代码。 @HajoKirchhoff map 类模板不是分层的。如果她想分层定义输入,则需要“下一个指针”。这可以指向"Key1" 处的数据或"Key2" 处的下一个节点。不过,C++ 中有更好的方法来实现这一点。 @harper:这正是我的观点。地图不是分层的。那么输入映射的数据类型怎么可能是 map 拥有 void* 的目的是它可以是字符串或另一个映射。这就是可以创建层次结构的方式。我相信我们可以使用 typeid 运算符来获取类型。如果它是一个字符串,那么我们只需打印它,如果它是一个映射,则使用 static_cast 将 void* 强制转换为该映射,然后递归调用相同的函数。这个问题实际上是在一个黑客队伍中被问到接受采访的。无法更改函数声明。 【参考方案1】:

使用增强属性树。 PropertyTree 能够表示层次结构,甚至带有一个小的 json 解析器。它还具有符合标准的迭代器,因此您可以遍历树并将每个节点复制到输出映射中,从而有效地展平树。

类似这样的东西(取自https://www.boost.org/doc/libs/1_65_1/doc/html/property_tree/tutorial.html):

namespace pt = boost::property_tree;
ptree tree;

// read the hierarchical data into the tree
pt::read_json(filename, tree);

map<string, string> out;
flatten(tree, out);

flatten 递归遍历树:

void flatten(const pt::tree &tree, map<string, string> &out)

   for (const auto &j:tree)
   
      copy_to_out(j, out);
      if (is_tree(j))
         flatten(j, out);
   

【讨论】:

以上是关于如何在 C++ 中展平字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在 linq 中展平字典<string,List<string>> 并在结果中保留键

如何展平熊猫数据框多列中的字典列表

如何展平Python字典中键的值(元组列表列表)?

如何展平此数据框

如何展平(int,dictionary)的字典?

Spark Python Pyspark 如何使用字典数组和嵌入式字典来展平列(sparknlp 注释器输出)