J'ai besoin d'inverser un dictionnaire de listes, je ne sais pas comment l'expliquer exactement en anglais, alors voici un code qui fait ce que je veux. Cela prend juste trop de mémoire.Inversion de dictionnaire sur place en Python
def invert(oldDict):
invertedDict = {}
for key,valuelist in oldDict.iteritems():
for value in valuelist:
try:
entry = invertedDict[value]
if key not in entry:
entry.append(key)
except KeyError:
invertedDict[value] = [key]
return invertedDict
L'original est une liste de listes, et le résultat est une liste de listes. Cela "l'inverse".
test = {}
test[1] = [1999,2000,2001]
test[2] = [440,441]
test[3] = [440,2000]
print invert(test)
Cela donne:
{2000: [1, 3], 2001: [1], 440: [2, 3], 441: [2], 1999: [1]}
Je dois savoir si cela peut être fait en place, parce que ma stratégie actuelle dépasse la quantité de mémoire physique sur ma machine avec le dictionnaire, je travaille avec. Pouvez-vous penser à un moyen de le faire avec des générateurs?
Avez-vous essayé 'shelve'? –
Je ne connaissais pas de shelve, merci. Je suppose que ni l'ancien ni le nouveau dictionnaires n'ont besoin d'être complètement chargés pour fonctionner dessus? – Nathan
L'étagère ne fonctionne qu'avec des clés à cordes. Vous pouvez contourner ce problème en utilisant –