Récupérer le premier et le dernier élément d’un OrderedDict


collections.OrderedDict est une structure de données que j’utilise de plus en plus, surtout que sa réécriture en C en 3.5 lui donne des performances décentes.

Néanmoins, il n’y a pas dans l’API de moyen de récupérer le premier ou le dernier élément inséré dans dico. Il y a bien popitem(), mais ça retire l’élément du dictionnaire, et c’est pas forcément ce qu’on veut.

Heureusement OrderedDict est un itérable, et implémente __reversed__, et on peut donc utiliser les outils suivant our récupérer les extrémités avec une perf 0(1):

>>> from collections import OrderedDict
>>> d = OrderedDict.fromkeys('azerty')
>>> next(iter(d.items())) # premier élément
'a'
>>> next(reversed(d.items())) # dernier élément
'y'

Après l’implémentation de OrderedDict reste une liste doublement chainée, et on ne peut donc pas récupérer un élément à un index arbitraire sans le parcourir à la main…

15 thoughts on “Récupérer le premier et le dernier élément d’un OrderedDict

  • Loïc

    La complexité ne serait pas plutôt O(n) ? Surtout pour le reversed()

  • Sam Post author

    Non c’est une liste doublement chainée, le dico a une références sur les deux extrémités de la liste. Le reversed retourne une vues itérable, non l’intégralité du dico inversé.

  • fero14041

    Merci! Merci pour l’image associée à l’article: une vraie pépite…

  • Stephane

    C’est cool. Mais sur la dernière doc (3.5.1°, il y a un exemple avec

    move_to_end(key, last=True)

    En gros, il est possible de déplacer une clé vers la fin du dico (c’est la valeur last par défaut) ou au début (si last est False).

    Donc, je suppose que cette ingénieuse manipulation proposée ici n’a plus lieu d’être, du moins depuis la version 3.2 de python, non ?

  • Sam Post author

    move_to_end permet de déplacer une clé, non récupérer la valeur liée à cette clé.

  • Michel D.

    Mmh… plus beaucoup de mouvement ici…

    Vous êtes partis en vacances ? vous travaillez comme des dingues ?

    Ou alors vous êtes déja devenus les maîtres du monde et vous en avez plus rien a foutre ?

    Vous me manquez les gars.

  • Sam Post author

    Max vient juste de rentrer d’asie, et moi j’ai une baisse de motiv sérieuse sur la programmation en ce moment. C’est une période de flottement.

  • fuckingasshole

    Je m’ennuie sans vos news ! Mes flux RSS sont pauvres ;), bon faut dire qu’il n’y a pas beaucoup d’actu ou de technos qui font bander en ce moment. Avec cette censure de merde on a plus le goût à rien.

  • Ryzz

    @sam: je rappelle que le slogan du site c’est:

    Du code, du cul

    Sauf si tu développe des algo pour la partie en gras, y a peut-être moyen d’être motivé ?

  • Sam Post author

    :) Ouai en plus j’ai des tas d’articles à moitié écrits, pas finis, etc. J’arrive juste pas à m’y mettre. J’ai l’inspiration. J’ai tout ce qu’il faut. Sauf la motiv.

  • ultra

    C’est un bon sujet la motivation.

    Il m’arrive souvent de tourner au tour du sujet pendant aller, 1 semaine.

    Je réfléchis au problème, j’élabore des solutions, tout ça dans ma tête.

    Je trouve toujours autre chose à faire, des clients qui appellent, des bugs à réparer, un truc à tester, etc… mais toujours pas coder la solution à ce foutu problème.

    Le cerveau travaille en tache de fond. Puis tout d’un coup, je prends conscience que le puzzle est assemblé et je code.

    1ère version marche plutôt bien, j’itère 3 fois, en 24h, problème résolu.

    Coder c’est un art, ça sera jamais un processus mécanique.

    Je suis toujours motivé pour faire quelque chose, mais quand c’est bancal, ça donne pas envie, c’est la ou c’est important de laisser le temps au temps pour que le cerveau y travaille en tache de fond.

    Je suis certain que si je m’étais imposé d’écrire 10 lignes de code / jour pendant une semaine, j’aurais écrit un code beaucoup plus mauvais que celui écrit en 24h après 1 semaine de maturation inconsciente.

    Donc Sam, laisse le temps faire son oeuvre.

    Je suis certain que quand le moment arrivera, tu balanceras 10 articles d’un coup.

  • bobricard

    Pour retrouver la motivation, rien de tel qu’une petite escort bien ficellée ;)

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.