2008-11-27 120 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

相關問題