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)]
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
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
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"
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
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...
"Isidore Ducasse" <b@nospam.fr> a écrit dans le message de news:
41c94665$0$10227$8fcfb975@news.wanadoo.fr...
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...
"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...
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
"F. Petitjean" <littlejohn.75@noos.fr> a écrit dans le message de news:
41c957b4$0$26549$626a14ce@news.free.fr...
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"
"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
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.
In article <cqbf1d$orl$1@news.univ-rennes1.fr>,
"Olivier Ravard" <olivier.ravard@novagrid.com> 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]
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]