9

在 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 时,有没有办法告诉字典要插入的对象类型?

4

5 回答 5

15

你想使用:

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

标准库defaultdict对象

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])]
于 2008-11-27T21:10:23.247 回答
10

可能是这样的:

myIndex = {}
for (someId,someVal) in collection:
    myIndex.setdefault(someId, []).append(someVal)
于 2008-11-27T21:06:08.997 回答
2

只是为了完成 Alastair 的答案:还有setdefault的get等价物,称为get(而不是 getdefault,正如人们可能认为的那样):

myIndex = {}
someId = None
myList = myIndex.get(someId, []) # myList is [] now
于 2008-11-27T22:04:32.623 回答
1

从 Python 2.5 起,您可以通过实现来获取 setdefault 或使用 defaultdict 的行为

__missing__(k)

如这里的注释 10所示。

于 2008-11-27T22:12:21.687 回答
0

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

myIndex = {}

for (someId,someVal) in collection:
   if someId not in myIndex:
       myIndex[someId] = []
   myIndex[someId].append(someVal)
于 2008-11-27T21:14:37.670 回答