map <int,vector <int =“”>&gt;的等价物是什么?在Python?</int,>

时间:2008-11-27 21:00:48

标签: python dictionary

在C ++中经常做这样的事情:

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时要插入的对象类型?

5 个答案:

答案 0 :(得分: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])]

答案 1 :(得分:10)

或许这样的事情:

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

答案 2 :(得分:2)

完成Alastair的答案: 还有 get 相当于 setdefault ,它被称为 get (而不是getdefault,正如人们所想的那样):

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

答案 3 :(得分:1)

从Python 2.5开始,您可以通过实现

来获取setdefault的行为或使用defaultdict
__missing__(k)

如注释10 here

答案 4 :(得分:0)

这个怎么样?它可能不是性能最佳的,但我认为它是“最可能有效的东西”。

myIndex = {}

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