2008-11-27 122 views
9

在C++中经常做这样的事情:Python中的map <int,vector <int>>的等效物是什么?

typedef map<int, vector<int> > MyIndexType; 

我在哪里,然后使用它是这样的:

MyIndexType myIndex; 
for(... some loop ...) 
{ 
    myIndex[someId].push_back(someVal); 
} 

如果有一个在地图上没有输入的代码将插入一个新的空载体,然后追加到它。

在Python它应该是这样的:

myIndex = {} 

for (someId,someVal) in collection: 
    try: 
     myIndex[someId].append(someVal) 
    except KeyError: 
     myIndex[someId] = [someVal] 

除了尝试是有点难看这里。在字典声明时遇到KeyError时,是否有方法告诉字典要插入的对象类型?

+0

你应该在你的C++代码中查找multimap <>。 – SoapBox 2008-11-27 21:09:15

+0

多图不一定是正确的数据结构。在地图中嵌套矢量很好。 – 2008-11-27 21:13:34

+0

同意:多地图不会保留插入的顺序,因为地图>会。 – Alastair 2008-11-27 21:19:04

回答

15

你想使用:

from collections import defaultdict 
myIndex = defaultdict(list) 
myIndex[someId].append(someVal) 

标准库defaultdict objects

用法示例从Python文档:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 
>>> d = defaultdict(list) 
>>> for k, v in s: 
     d[k].append(v) 

>>> d.items() 
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] 
10

像这样的东西可能:

myIndex = {} 
for (someId,someVal) in collection: 
    myIndex.setdefault(someId, []).append(someVal) 
0

这个怎么样?这可能不是性能最佳的,但我认为这是“可能有效的最简单的事情”。

myIndex = {} 

for (someId,someVal) in collection: 
    if someId not in myIndex: 
     myIndex[someId] = [] 
    myIndex[someId].append(someVal) 
2

只是为了完成由阿拉斯泰尔答案: 也有得到相当于setdefault,这就是所谓得到(而不是getdefault,因为人们可能会认为)的:

myIndex = {} 
someId = None 
myList = myIndex.get(someId, []) # myList is [] now 
1

从Python 2.5开始,你可以通过执行

得到setdefault的行为或使用defaultdict

如附注10 here

相关问题