在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时要插入的对象类型?
答案 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)
答案 4 :(得分:0)
这个怎么样?它可能不是性能最佳的,但我认为它是“最可能有效的东西”。
myIndex = {}
for (someId,someVal) in collection:
if someId not in myIndex:
myIndex[someId] = []
myIndex[someId].append(someVal)