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 :

Dictionnaire ordonnée ou pas / Python 3.6 vs 3.7


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Dictionnaire ordonnée ou pas / Python 3.6 vs 3.7
    bonjour,

    je ne comprends pas l'idée qu'un dictionnaire n'est pas ordonné. Qu'est ce qui n'est pas ordonnée les clés ou les valeurs ? Pourquoi une liste est ordonnée ?

    Je lies aussi que depuis 3.7 un dictionnaire est maintenant ordonné?

    Je suis un peu perdu et la doc sur le net n'est pas très parlante pour moi.

    Pouvez-vous m'éclairer ?

    Merci

  2. #2
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Bonjour,

    Par exemple, dans le code suivant, qui parcourt les clefs d'un dictionnaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my_dict = {"g": "Gabriel", "a": "Alain", "r": "Robert", "e": "Emmanuel"}
    print("".join(my_dict))
    depuis Python 3.7, on a la garantie que ça affiche "gare", car on a la garantie que ces clefs sont parcourues selon un certain ordre.

    En Python 3.6, par contre, l'implémentation avait le droit de parcourir les clefs dans un ordre différent. Par exemple, l'implémentation avait le droit d'afficher "rage".

    Remarque : il existe plusieurs implémentations de Python. En CPython (l'implémentation officielle de Python), dès la version 3.6, les clefs des dictionnaires étaient ordonnées de la même manière qu'en 3.7, donc on était déjà sûr que le code ci-dessus affichait "gare" avec CPython, mais il n'y avait pas encore de garantie que ça continue d'être le cas plus tard.

    Rq : sources sur cette histoire de clefs ordonnées :


    Une liste est ordonnée dans le sens où, par exemple, dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my_list = ["g", "a", "r", "e"]
    print("".join(my_list))
    "g" est à la position 0, "a" à la position 1, "r" à la position 2 et "e" à la position 3 et ce print affiche forcément "gare". L'ordre est bien défini.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par vuvu960 Voir le message
    je ne comprends pas l'idée qu'un dictionnaire n'est pas ordonné. Qu'est ce qui n'est pas ordonnée les clés ou les valeurs ? Pourquoi une liste est ordonnée ?

    Je lies aussi que depuis 3.7 un dictionnaire est maintenant ordonné?
    listes et dictionnaires sont des collections ou des ensembles de... qui se distinguent par l'accès à leur différents éléments: la liste est une suite de... un tableau, on accède à ses éléments via un index (pareil pour les chaines de caractères); les dictionnaires sont des tableaux associatifs clef => valeur où on accède à la clef pour récupérer la valeur.

    Un tableau n'est pas ordonné naturellement.
    On le trie pour qu'il le devienne. Et si ses éléments ont été rangés par ordre croissants, on aura T[i] <= T[i+1] pour toutes les indices du tableau (excepté le dernier).

    Par contre, si je remplis un tableau en ajoutant successivement des éléments à la fin. On aura préservé l'ordre des insertions: T[i+1] aura été ajouté après T[i]. Ce qui ne dit rien sur la relation d'ordre entre T[i] et T[i+1].

    Pour un tableau associatif, préserver l'ordre d'insertion dépend de l'implémentation... c'est un plus de pouvoir compter dessus (parce que çà a des applications intéressantes).

    Dans tout les cas, préserver l'ordre d'insertion est différent de "être ordonné".

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

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par vuvu960 Voir le message
    je ne comprends pas l'idée qu'un dictionnaire n'est pas ordonné.
    C'est parce qu'à l'origine, les concepteurs n'ont envisagé l'utilisation d'un dictionnaire que de façon directe (accès par la clef). Il y a bien des méthodes qui donnent l'ensemble des clefs (ou des valeurs) pour faire certains traitements itératifs mais ils n'ont pas envisagé que les dictionnaires pourraient avoir besoin d'être utilisés dans des circonstances où l'ordre serait important

    Citation Envoyé par vuvu960 Voir le message
    Qu'est ce qui n'est pas ordonnée les clés ou les valeurs ?
    Ben un peu les deux. Puisque les valeurs sont liées aux clefs, si l'un n'est pas ordonné l'autre ne l'est pas. Alors bon en réalité, un dictionnaire est quand-même ordonné sauf que l'ordre d'ordonnancement, qui est celui du hash mathématique des clefs, ne correspond à rien d'utilisable pour le programmeur. Ce n'est pas un ordre alphabétique (ou numéraire) et ce n'est pas non plus l'ordre de création. Mais pour un dictionnaire, si tu demandes 50 fois sa liste de clefs (ou de valeurs) tu auras 50 fois le même résultat (je parle pour les versions inférieures à 3.7)

    Citation Envoyé par vuvu960 Voir le message
    Pourquoi une liste est ordonnée ?
    Ben parce que le but de la liste (qui est l'équivalent des tableaux des autres langages) est de stocker des items dans l'ordre donné. Si je stocke ["toto", "titi", "tata"] c'est que je les veux à priori dans cet ordre.

    Citation Envoyé par vuvu960 Voir le message
    Je lies aussi que depuis 3.7 un dictionnaire est maintenant ordonné?
    Oui, ordonné comme une liste, dans l'ordre de création des clefs.

    PS: bien entendu, comme le dit wiztricks, j'ai présumé que le terme que tu nommais "ordonné" signifiait pour toi "ordre de création"...
    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]

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci pour vos réponses

    Si je comprends bien. Avant 3.7 les dict étaient quand même ordonnés mais un ordre qui n'est pas en rapport avec l'ordre de création des clés. Un ordre qui finalement ne nous parle pas (mais c'est la raison que l'on a à chaque fois le même résultat comme le dit Sve@r).

    Alors qu'avec 3.7, l'ordre de création des clés est respecté

    C'est bien juste ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vuvu960 Voir le message
    Si je comprends bien. Avant 3.7 les dict étaient quand même ordonnés mais un ordre qui n'est pas en rapport avec l'ordre de création des clés. Un ordre qui finalement ne nous parle pas (mais c'est la raison que l'on a à chaque fois le même résultat comme le dit Sve@r).
    Ouais. Ils sont ordonnés mais dans un ordre interne Python et pour nous...

    Citation Envoyé par vuvu960 Voir le message
    Alors qu'avec 3.7, l'ordre de création des clés est respecté
    Yep. Et ça, ça peut aider. Par exemple j'ai des requêtes SQL que je dois afficher dans des colonnes à l'écran. Me suffit de créer le dico avec les colonnes en clef dans l'ordre d'affichage dans lequel je les veux, puis claquer le résultat de la requête dans le dico (ce qui est fait naturellement avec psycopg2 quand tu utilises un DictCursor pour faire ta requête) et j'ai plus qu'à faire une boucle. Auparavant, soit je passais par les OrderedDict du module collections, soit je créais une seconde liste qui contenait les clefs de mes colonnes dans l'ordre d'affichage et je bouclais sur cette liste pour taper dans le dico correspondant.
    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. informix supporte pas Python >2.9
    Par HTIBM dans le forum Informix
    Réponses: 0
    Dernier message: 11/07/2018, 11h58
  2. [Python 3.X] Exécution pas à pas Python
    Par Nexus-Toxiik dans le forum Général Python
    Réponses: 3
    Dernier message: 06/01/2016, 19h17
  3. premiers pas dans Python - palindrome
    Par tarang dans le forum Général Python
    Réponses: 1
    Dernier message: 31/10/2006, 16h56
  4. ordonner ou ne pas ordonner une JList
    Par Isher dans le forum Composants
    Réponses: 1
    Dernier message: 20/04/2006, 13h42
  5. [PIL] appli tournant en python mais pas en exe
    Par pfeuh dans le forum Py2exe
    Réponses: 11
    Dernier message: 09/03/2006, 18h56

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