如何用Python 3单行初始化C++中map<string, map<string, vector<int>>>等价结构?
等价数据结构与单行初始化方案
嘿,我太懂你从C++转Python时对这种嵌套容器的困惑了!先给你理清楚对应关系:
- C++里的
map<string, T>对应Python的dict[str, T](Python 3.9+支持这种类型提示,低版本可以省略类型标注用普通dict) - C++的
vector<int>直接对应Python的list[int](或普通list)
所以你要的map<string, map<string, vector<int>>>,在Python里就是嵌套字典,最内层绑定列表,下面给你两种单行初始化的方案:
1. 最直接的普通空字典初始化
如果只是需要一个空的等价结构,一行代码就能搞定:
inverted_index = {}
不过这种方式下,往里面加元素时需要手动检查内层结构是否存在,举个例子:
# 往结构里添加词、文档ID和位置 word = "apple" doc_id = "doc1" position = 5 if word not in inverted_index: inverted_index[word] = {} if doc_id not in inverted_index[word]: inverted_index[word][doc_id] = [] inverted_index[word][doc_id].append(position)
2. 用defaultdict自动创建嵌套结构(更省心)
要是不想每次加元素都写一堆判断,可以用Python标准库collections里的defaultdict,单行就能初始化一个自动生成内层结构的版本:
from collections import defaultdict inverted_index = defaultdict(lambda: defaultdict(list))
这下就可以直接往里面塞元素了,完全不用管内层的字典和列表有没有创建:
# 直接添加,自动补全内层结构 inverted_index["apple"]["doc1"].append(5) inverted_index["banana"]["doc2"].append(12)
如果需要加上类型提示让结构更清晰(Python 3.9+适用),可以这么写:
from collections import defaultdict inverted_index: defaultdict[str, defaultdict[str, list[int]]] = defaultdict(lambda: defaultdict(list))
额外小提示
- Python是动态类型语言,不像C++需要提前声明完整的结构类型,所以空字典
{}本身就是合法的初始结构,后续可以动态嵌套字典和列表。 - 如果你需要像C++
map那样的有序性:Python 3.7及以上的普通dict已经是插入有序的;如果需要按键排序,随时用sorted(inverted_index.keys())来处理就行。
内容的提问来源于stack exchange,提问作者Ankit Srivastava
相关产品推荐
相关产品推荐

