J'ai une liste de valeurs et je veux les mettre dans un dictionnaire qui ferait mapper chaque valeur à son indice.
Je peux le faire de cette façon: p> J'ai rencontré ce qui suit, mais cela fait le contraire de ce dont j'ai besoin: P> >>> d = dict(enumerate(t))
>>> d
{0: 5, 1: 6, 2: 7}
6 Réponses :
Vous pouvez utiliser une compréhension de liste (ou un générateur, en fonction de votre version Python) pour effectuer un simple échange de place pour votre deuxième exemple.
Utilisation d'une compréhension de liste: P>
d = dict((y,x) for x,y in enumerate(t))
Vous n'avez pas besoin du [] code> là-bas.
dict code> fonctionne bien avec une expression génératrice (enregistre une liste intermédiaire)
Oui, c'est pourquoi j'ai écrit "Selon votre version Python". Les générateurs ont longtemps été longtemps (depuis 2,4), donc je comprendrai les deux
@ J.f. Sebastian dans des systèmes déployés développés avant 2004? Python existe depuis longtemps maintenant. Il n'est pas difficile d'imaginer avoir à travailler sur une application Python 2.0, je veux dire certaines personnes toujours i> doivent travailler dans VB6.
>>> dict((x,i) for i,x in enumerate(t)) {5: 0, 6: 1, 7: 2} >>>
Tous vos éléments sont-ils uniques (c'est-à-dire que votre liste ne serait jamais 5,6,7,7)? La solution de dict ne fonctionnera que si tous vos éléments sont uniques. P>
En stockant l'index, vous avez essentiellement dupliquer des informations, car vous pouvez simplement interroger l'index actuel de l'élément de la liste. Les informations sur la duplication ne sont généralement pas la meilleure idée, car elles permettent à la possibilité qu'un ensemble de données soit soumis à la synchronisation de l'autre. P>
Si la liste est modifiée, rien ne vous empêche d'attribuer accidentellement le même index à plusieurs éléments. P>
Pourquoi essayez-vous de stocker la valeur d'index lorsque vous pouvez simplement obtenir l'index de la liste? p>
Tous les éléments de la liste sont uniques. Je stocke l'index pour une recherche rapide dans une structure de données différente.
Cela ressemble à un niveau d'indirection inutile si tous les éléments sont uniques, testez l'appartenance à dans code> et indexer avec
index () code>. Je suppose que vous imaginez qu'un dictionnaire sauvegardé de carte de hachage vous donnera une recherche plus rapide que
index () code> sera. Dans Python Optimisation prématurée, c'est vraiment mal parce que vos intuitions sur "plus rapides" sont souvent fausses jusqu'à ce qu'elles soient chronométrées. Faites-le travailler, puis découvrez où vous êtes lent, la complexité ajoutée ne vaut pas la peine.
@Dragan, modifiez-vous votre liste ou restez-vous statique?
@MSW est une préoccupation valide, en général, je suis d'accord avec vous, dans ce cas, je pense que ça vaut la peine Python -Mimeit -s "T = plage (int (1e2))" "VRAITVAL = (55 in t)" # 3.11 USEC par boucle python -mtime -s "t = plage (int (1e2)); d = dict (zip (t, plage (len (t))))" "VRAITVAL = (55 in D)" # 0.138 USEC par boucle Python -mTimeit -s "t = plage (int (1e2))" "IDXVAL = T.Index (55)" # 3.46 USEC par boucle Python -Mtime -S "T = plage (int (1e2)); D = dict ( Zip (t, plage (len (t)))) "" Indexval = D [55] "# 0.136 USEC par boucle
@DRAGAN: Assertion confirmée, même lorsque j'ai biaisé votre test follement contre les dictionnaires par l'utilisation de "5" en tant que dict cible qui a toujours fui les listes de portes d'un facteur entre 3 et 7 fois plus rapides. Je pensais que le cache Hits / Misses peut avoir été confond, il ne semble pas être pour mon système, même avec la liste de la liste de 1e7 qui l'a obligé à échanger. (Python 2.6.5 Linux 2.6)
J'aime la dicte (zip (T, plage (len (t)))) meilleur. p>
in python2.7 + Vous pouvez l'écrire comme ceci
Comme tout le monde a déjà écrit, dans Python 2.6, je considérerais comme le plus pythonique: toujours, dans un moment de frénésie fonctionnelle, j'écrirais: p> < Pré> xxx pré> p>
Je suis curieux - laquelle des implémentations est plus rapide? En passant, Chewy, quelle version de Python utilisez-vous?