9
votes

manière pythonique d'associer des éléments de liste avec leurs indices

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> xxx pré> Ce n'est pas mauvais, mais je cherche quelque chose de plus élégant. 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}


1 commentaires

Je suis curieux - laquelle des implémentations est plus rapide? En passant, Chewy, quelle version de Python utilisez-vous?


6 Réponses :


14
votes

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))


3 commentaires

Vous n'avez pas besoin du [] là-bas. dict 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 doivent travailler dans VB6.



4
votes
>>> dict((x,i) for i,x in enumerate(t))
{5: 0, 6: 1, 7: 2}
>>>

0 commentaires

2
votes

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.

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.

Si la liste est modifiée, rien ne vous empêche d'attribuer accidentellement le même index à plusieurs éléments.

Pourquoi essayez-vous de stocker la valeur d'index lorsque vous pouvez simplement obtenir l'index de la liste?


5 commentaires

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 et indexer avec index () . Je suppose que vous imaginez qu'un dictionnaire sauvegardé de carte de hachage vous donnera une recherche plus rapide que index () 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)



0
votes

J'aime la dicte (zip (T, plage (len (t)))) meilleur.


0 commentaires

14
votes

in python2.7 + Vous pouvez l'écrire comme ceci xxx


0 commentaires

2
votes

Comme tout le monde a déjà écrit, dans Python 2.6, je considérerais comme le plus pythonique: xxx

toujours, dans un moment de frénésie fonctionnelle, j'écrirais: < Pré> xxx


0 commentaires