De la documentation :
inversé ( seq )
Retournez un revers iterator
. seq doit être un objet qui a une __reversed__()
méthode ou prend en charge le protocole de séquence (la __len__()
méthode et la __getitem__()
méthode avec des arguments entiers commençant à 0).
Un dict
objet n'est pas implémenté __reversed__
. Il met en œuvre les deux dernières méthodes. Cependant, __getitem__
prend des clés comme arguments plutôt que des entiers (à partir de 0).
Quant à savoir pourquoi, cela a déjà été suggéré et discuté ici .
ÉDITER:
Ces citations proviennent de la liste de diffusion Python-Dev (thread "Add __reversed__ methods for dict", démarré le 25. 05. 18), je vais commencer par les arguments "conceptuels", le premier vient d'Antoine Pitrou:
Cela ne vaut rien que OrderedDict supporte déjà inversé (). L'argument pourrait aller dans les deux sens:
dict est similaire à OrderedDict de nos jours, il devrait donc également prendre en charge reverse ();
vous pouvez utiliser OrderedDict pour signaler explicitement que vous vous souciez de la commande; pas besoin d'ajouter quoi que ce soit à dicter.
Je pense que l'ordre d'insertion garanti pour les textes normaux est tout nouveau, il faudra donc un certain temps pour que la notion s'installe et fasse partie de la réflexion quotidienne sur les textes. Une fois que cela se produit, il est probablement inévitable que des cas d'utilisation émergent et que __reversed__ soit ajouté à un moment donné. La mise en œuvre semble simple et il ne s'agit pas d'un grand saut conceptuel de s'attendre à ce qu'une collection ordonnée finie soit réversible.
Suivi de la réponse de Raymond Hettinger:
Étant donné que les dicts suivent désormais l'ordre d'insertion, il semble raisonnable de vouloir connaître les insertions les plus récentes (c'est-à-dire boucler sur les tâches les plus récemment ajoutées dans un dict de tâche). D'autres cas d'utilisation possibles correspondront probablement à la façon dont nous utilisons la commande queue Unix.
Si ces cas d'utilisation se présentent, il serait bien que __reversed__ soit déjà pris en charge afin que les gens ne soient pas tentés d'implémenter une solution de contournement laide en utilisant des appels popitem () suivis de réinsertions.
La principale préoccupation exprimée dans la liste de diffusion était que cela ajouterait trop de ballonnement ou réduirait l'efficacité de la mémoire (avoir des listes doublement liées au lieu de celles liées individuellement) dans au moins certaines implémentations, voici la citation d'Inada Naoki de Python bug tracker ( problème 33462 ):
"Avoir un ordre" ne signifie pas "réversible". Par exemple, une seule liste chaînée est ordonnée, mais non réversible.
Alors que l'implémentation de CPython peut être efficace __reverse__
, l'ajout __reverse__
signifie que toute implémentation de Python devrait le fournir. Par exemple, certaines implémentations Python peuvent être capables d'implémenter dict avec hashmap + liste liée unique. Si __reverse__
est ajouté, ce n'est plus possible.
De retour à la liste de diffusion, voici les deux derniers messages (tous deux postés le 08.06.2018). Le premier est de Michael Selik:
Ai-je raison de dire que le consensus est +1 pour l'inclusion dans la v3.8?
Le dernier point de la discussion était INADA Naoki recherchant diverses implémentations et décidant qu'il est OK d'inclure cette fonctionnalité dans 3.8. Si je comprends bien, Guido était d'accord avec les conseils de l'INADA d'attendre la mise en œuvre de MicroPython de la v3.7. Depuis INADA a changé d'avis, je suppose que tout est en faveur?
En conclusion avec le message de Guido van Rossum:
Cela me semble juste. Nous aurons alors eu deux versions où ce fut le cas:
Comme indiqué dans les autres réponses et commentaires, reversed()
est pris en charge pour les dict et dictviews depuis la version 3.8 (14.10.2018).
dict
objet normal (du moins non garanti par le langage), donc celareversed
n'avait aucun sens__reversed__
"? Le lien python-dev a un contenu utile, mais les parties pertinentes doivent être reproduites directement dans la réponse (car ces liens hors site ont tendance à pourrir).Depuis python 3.8 reverse () est utilisable sur les dict
la source
Mise à jour pour python 3.8
Dict et dictviews sont désormais itérables dans l'ordre d'insertion inversé à l'aide de reverse ()
la source