values keys empty dictionaries create python dictionary

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)