OVH Cloud OVH Cloud

question dictionnaire ...

5 réponses
Avatar
Olivier Ravard
Bonjour,

Voici un problème que je peux résoudre à l'aide de plusieurs lignes
mais existe-t-il un moyen plus efficace ?
J'ai un dictionnaire tel que

a={'toto':1, 'titi':2, 'tata':3}

Je cherche un moyen qui me renverrai la clé pour la valeur maximale
du dictionnaire, c-a-d ici 'tata'.
La solution la plus efficace que j'ai trouvée est :

import Numeric
b = []
c = []
[(b.append(r[0]),c.append(r[1])) for r in a.items()]
res = b[Numeric.argmax(c)]

Quelqu'un a-t-il une meilleure solution ?

O.R.

5 réponses

Avatar
Isidore Ducasse
Peut être un peu plus simple et lisible (enfin je trouve...)

def cle_max(dico,maxinit = -1000000):
max = maxinit
for x in dico.keys():
if dico[x]>max : clemax,max = x,dico[x]
return clemax
Avatar
F. Petitjean
On Wed, 22 Dec 2004 10:33:36 +0100, Olivier Ravard wrote:
Bonjour,

Voici un problème que je peux résoudre à l'aide de plusieurs lignes
mais existe-t-il un moyen plus efficace ?
J'ai un dictionnaire tel que

a={'toto':1, 'titi':2, 'tata':3}

Je cherche un moyen qui me renverrai la clé pour la valeur maximale
du dictionnaire, c-a-d ici 'tata'.
La solution la plus efficace que j'ai trouvée est :

import Numeric
b = []
c = []
[(b.append(r[0]),c.append(r[1])) for r in a.items()]
res = b[Numeric.argmax(c)]

Quelqu'un a-t-il une meilleure solution ?

Waouh le marteau pilon pour écraser une mouche, vous n'auriez pas

encore plus indirect/tordu ? :-)

.>>> dico = dict(toto=1, tata=2, titi=3)
.>>> aux = [ (val, cle) for cle, val in dico.iteritems() ]
.>>> max(aux)
(3, 'titi')

Autrement dit return max(aux)[1] dans la fonction qui va bien devrait
faire l'affaire.

Si vous avez un python 2.4 avec les "generator expressions" c'est encore
plus immédiat et plus efficace (en terme d'occupation mémoire) :
.>>> max(((val, cle) for cle, val in dico.iteritems()))
(3, 'titi')

et on n'est même pas obligé d'entourer l'expression de parenthèses :
.>>> max((val, cle) for cle, val in dico.iteritems())
(3, 'titi')

Finalement c'est moi qui vous remercie puisque votre question m'a permis
de tester sur un cas pratique ces fameuses "generator expressions"

Cordialement

Avatar
Olivier Ravard
"Isidore Ducasse" a écrit dans le message de news:
41c94665$0$10227$
Peut être un peu plus simple et lisible (enfin je trouve...)

def cle_max(dico,maxinit = -1000000):
max = maxinit
for x in dico.keys():
if dico[x]>max : clemax,max = x,dico[x]
return clemax


pas de boucle for, c'est trop lent. Et en plus il y a un if dedans...

Avatar
Olivier Ravard
"F. Petitjean" a écrit dans le message de news:
41c957b4$0$26549$
On Wed, 22 Dec 2004 10:33:36 +0100, Olivier Ravard wrote:
Bonjour,

Voici un problème que je peux résoudre à l'aide de plusieurs lignes
mais existe-t-il un moyen plus efficace ?
J'ai un dictionnaire tel que

a={'toto':1, 'titi':2, 'tata':3}

Je cherche un moyen qui me renverrai la clé pour la valeur maximale
du dictionnaire, c-a-d ici 'tata'.
La solution la plus efficace que j'ai trouvée est :

import Numeric
b = []
c = []
[(b.append(r[0]),c.append(r[1])) for r in a.items()]
res = b[Numeric.argmax(c)]

Quelqu'un a-t-il une meilleure solution ?

Waouh le marteau pilon pour écraser une mouche, vous n'auriez pas

encore plus indirect/tordu ? :-)



C'est bien pour cela que je demande l'avis au groupe...


.>>> dico = dict(toto=1, tata=2, titi=3)
.>>> aux = [ (val, cle) for cle, val in dico.iteritems() ]
.>>> max(aux)
(3, 'titi')



Voilà. Merci...

Autrement dit return max(aux)[1] dans la fonction qui va bien devrait
faire l'affaire.

Si vous avez un python 2.4 avec les "generator expressions" c'est encore
plus immédiat et plus efficace (en terme d'occupation mémoire) :
.>>> max(((val, cle) for cle, val in dico.iteritems()))
(3, 'titi')

et on n'est même pas obligé d'entourer l'expression de parenthèses :
.>>> max((val, cle) for cle, val in dico.iteritems())
(3, 'titi')

Finalement c'est moi qui vous remercie puisque votre question m'a permis
de tester sur un cas pratique ces fameuses "generator expressions"

Cordialement



Avatar
Laurent
In article <cqbf1d$orl$,
"Olivier Ravard" wrote:

Bonjour,

Voici un problème que je peux résoudre à l'aide de plusieurs lignes
mais existe-t-il un moyen plus efficace ?
J'ai un dictionnaire tel que

a={'toto':1, 'titi':2, 'tata':3}

Je cherche un moyen qui me renverrai la clé pour la valeur maximale
du dictionnaire, c-a-d ici 'tata'.
La solution la plus efficace que j'ai trouvée est :

import Numeric
b = []
c = []
[(b.append(r[0]),c.append(r[1])) for r in a.items()]
res = b[Numeric.argmax(c)]

Quelqu'un a-t-il une meilleure solution ?

O.R.


Hello,

Je ne sais pas si ce sera plus rapide, mais voilà une autre soluce :

dico = {'toto':1, 'titi':2, 'tata':3}
m = max(dico.values())
filter(lambda x: x[1] == m, dico.items())[0][0]


done:

'tata'

A+,
Laurent.