IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Trouver LES plus grand dans un dict


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Par défaut Trouver LES plus grand dans un dict
    Bonjour,

    Je cherche a trouver Les plus grands élément dans un dict.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    val = {'a': 4, 'b': 1, 'c': 4, 'd' : 3  }
    maxi = max(val, key=val.get)
    print(maxi)
    Ce code me donne bien 'a', mai je voudrais avoir comme résultat {'a', 'c'}
    J'ai tenté avec plusieurs truc mais pas trouvé (et s'astrouve c'est tout con ;-) ).

    Merci
    Steph

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    max retourne une seule valeur... et s'il y en a plusieurs, il faut écrire une boucle qui construise la liste de...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par stephbb75 Voir le message
    Ce code me donne bien 'a', mai je voudrais avoir comme résultat {'a', 'c'}
    J'ai tenté avec plusieurs truc mais pas trouvé (et s'astrouve c'est tout con ;-) ).
    Ouais, s'astrouve... set(x[0] for x in val.items() if x[1] == max(val.values())).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 065
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut

    Ouais, s'astrouve... set(x[0] for x in val.items() if x[1] == max(val.values())).
    Mais algorithmiquement je pense qu'il y a mieux, mais c'est plus long.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def get_max(val):    
        keys = list(val.keys())
        maxi = val[keys[0]]
        results = [keys[0]]
        for key in keys[1:]:
            value = val[key]
            if value > maxi:
                results = [key]
            elif value == maxi:
                results.append(key)
        return results
    Je dois bien gagner une boucle de trop (je pense à max(val.values()))

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Mais algorithmiquement je pense qu'il y a mieux, mais c'est plus long.Je dois bien gagner une boucle de trop (je pense à max(val.values()))
    Sais pas trop. Effectivement le max() effectue un premier balayage dans tout le tableau, balayage que j'effectue ensuite une seconde fois dans la comprehension mais c'est juste un "double balayage" et non pas un "balayage dans le balayage" donc on ne tombe pas dans le N² (enfin j'espère que le max() n'est pas effectué à chaque comparaison ).
    De ton côté tu multiplies les accès crochets qui ne sont pas gratuits et surtout tu as un append() qui est généralement perçu comme gros consommateur de ressources.
    Peut-être un bench dirait lequel des deux mais j'ai un peu la flemme ce soir.

    [edit]Ah ben si, j'ai écrit ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def xxx(val):
    	print("xxx")
    	return max(val.values())
    print(set(x[0] for x in val.items() if x[1] == xxx(val)))
    Et j'ai eu la douleur de voir apparaitre "xxx" 4 fois
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 065
    Par défaut
    Oui tu te doutes bien que j'avais déjà fais le test et de comprendre pourquoi ça allait deux fois moins vite

    Disons qu'un des avantages de ton code c'est la partie optimisation de la fonction max, mais elle ne suffit pas à combler cette boucle supplémentaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    from timeit import timeit
     
    def get_max(val):
        keys = list(val.keys())
        maxi = val[keys[0]]
        results = [keys[0]]
        for key in keys[1:]:
            value = val[key]
            if value > maxi:
                results = [key]
            elif value == maxi:
                results.append(key)
        return results
     
     
    def get_max_sveor(val):
        return set(x[0] for x in val.items() if x[1] == max(val.values()))
     
     
    val = {'a': 4, 'b': 1, 'c': 4, 'd': 3}
    print(timeit("get_max(val)", setup="from __main__ import get_max, val"))
    print(timeit("get_max_sveor(val)", setup="from __main__ import get_max_sveor, val"))
    Ce qui donne chez moi,

    0.49668644499615766
    1.1246752470033243

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Disons qu'un des avantages de ton code c'est la partie optimisation de la fonction max, mais elle ne suffit pas à combler cette boucle supplémentaire.
    Pour supprimer le N², j'ai tenté...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def get_max_sveor(val):
    	m=max(val.values())
    	return set(x[0] for x in val.items() if x[1] == m)
    ... et je passe de 0.8144763539312407 à 0.78484934696462 (mais tu restes gagnant). Ceci dit, si on remplace ton list() de la ligne 2 par un tuple(), on passe de (chez-moi) 0.5988283799961209 à 0.5485420490149409 (il n'y a pas de petites économies )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/03/2019, 08h59
  2. Trouver les deux points les plus éloignés dans un fichier .stp/.step (ISO-10303-21)
    Par delta07 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 03/04/2017, 17h08
  3. Réponses: 6
    Dernier message: 11/11/2015, 13h38
  4. [MySQL] Trouver les mots les plus répétés dans un champ
    Par maxence64 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/05/2011, 13h20
  5. Réponses: 13
    Dernier message: 09/08/2008, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo