keys - ¿Cuál es el equivalente de map<int, vector<int>> en Python?
python dictionary values (5)
Algo como esto quizás:
myIndex = {}
for (someId,someVal) in collection:
myIndex.setdefault(someId, []).append(someVal)
En C ++ a menudo hacemos algo como esto:
typedef map<int, vector<int> > MyIndexType;
Donde luego lo uso así:
MyIndexType myIndex;
for( ... some loop ...)
{
myIndex[someId].push_back(someVal);
}
Si no había ninguna entrada en el mapa, el código insertará un nuevo vector vacío y luego se agregará a él.
En Python se vería así:
myIndex = {}
for (someId,someVal) in collection:
try:
myIndex[someId].append(someVal)
except KeyError:
myIndex[someId] = [someVal]
El intento, excepto que es un poco feo aquí. ¿Hay alguna manera de indicarle al diccionario un tipo de objeto para insertar cuando se encuentra un KeyError en el momento de declaración del diccionario?
Desde Python 2.5 y en adelante puede obtener el comportamiento de setdefault o usar defaultdict implementando
__missing__(k)
como en la nota 10 aquí .
Desea usar:
from collections import defaultdict
myIndex = defaultdict(list)
myIndex[someId].append(someVal)
Objetos defaultdict
biblioteca estándar.
Ejemplo de uso de la documentación de 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])]
Solo para completar la respuesta de Alastair: También existe el get equivalente a setdefault , que se llama get (y no getdefault, como se podría pensar):
myIndex = {}
someId = None
myList = myIndex.get(someId, []) # myList is [] now
¿Qué tal esto? Puede que no sea óptimo para el rendimiento, pero creo que es "lo más simple que podría funcionar".
myIndex = {}
for (someId,someVal) in collection:
if someId not in myIndex:
myIndex[someId] = []
myIndex[someId].append(someVal)