Comment utiliser OrderedDict, un dictionnaire ordonné en Python.

Affaires

Les dictionnaires Python (objets de type dict) ne préservent pas l'ordre des éléments ; CPython le fait depuis la version 3.6, mais cela dépend de l'implémentation et est indéfini dans les autres implémentations ; la spécification du langage préserve l'ordre depuis la version 3.7.

OrderedDict est fourni dans le module collections de la bibliothèque standard comme un dictionnaire qui préserve l'ordre. Vous pouvez l'utiliser en toute sécurité.

Importez le module collections. Il est inclus dans la bibliothèque standard et n'a pas besoin d'être installé.

import collections

Si vous écrivez ce qui suit, vous pouvez omettre les collections. dans les exemples suivants.

from collections import OrderedDict

Ce qui suit est une description de la manière d'utiliser OrderedDict.

  • Création d'un objet OrderedDict
  • OrderedDict est une sous-classe de dict
  • Déplacer des éléments au début ou à la fin
  • Ajoutez un nouvel élément à n'importe quelle position.
  • Réorganiser (réordonner) les éléments
  • Trier les éléments par clé ou par valeur

Création d'un objet OrderedDict

Le constructeur collections.OrderedDict() peut être utilisé pour créer un objet OrderedDict.

Créer un objet OrderedDict vide et ajouter des valeurs.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Il est également possible de spécifier des arguments au constructeur.

Vous pouvez utiliser des arguments de type mot-clé, des séquences de paires clé-valeur (comme les tuples (clé, valeur)), etc. Ce dernier peut être une liste ou un tuple tant qu'il s'agit d'une paire clé-valeur.

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

Jusqu'à la version 3.5, l'ordre des arguments des mots-clés n'était pas préservé, mais depuis la version 3.6, il l'est maintenant.

Modifié dans la version 3.6 : Avec l'acceptation du PEP 468, l'ordre du constructeur d'OrderedDict et des arguments de mots-clés passés à la méthode update() est préservé.
collections — Container datatypes — Python 3.10.0 Documentation

Les dictionnaires normaux (objets de type dict) peuvent également être passés au constructeur, mais dans le cas d'implémentations où le type dict ne préserve pas l'ordre, l'OrderedDict généré à partir de celui-ci ne préservera pas non plus l'ordre.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict est une sous-classe de dict

OrderedDict est une sous-classe de dict.

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict possède également les mêmes méthodes que dict, et les méthodes pour obtenir, modifier, ajouter et supprimer des éléments sont les mêmes que pour dict.

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Voir l'article suivant pour plus de détails.

Déplacer des éléments au début ou à la fin

Vous pouvez utiliser la méthode move_to_end() propre à OrderedDict pour déplacer un élément au début ou à la fin.

Spécifiez la clé comme premier argument. Par défaut, la clé est déplacée à la fin, mais si le deuxième argument last est faux, elle sera déplacée au début.

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

Ajoutez un nouvel élément à n'importe quelle position.

Il est possible de créer un nouvel objet OrderedDict avec un nouvel élément ajouté à une position arbitraire. Plus précisément, cela peut être fait dans le flux suivant.

  1. Liste les objets de vue qui peuvent être obtenus avec la méthode items() en utilisant list().
  2. Ajoutez un tuple (clé, valeur) de paires clé-valeur dans la méthode insert() de la liste.
  3. Créer un nouvel objet en le passant au constructeur collections.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

insert() spécifie la position à insérer comme premier argument, et l'élément à insérer comme second argument.

Dans l'exemple, un nouvel objet est affecté à la variable d'origine, et aucun nouvel élément n'est ajouté à l'objet d'origine lui-même.

Réorganiser (réordonner) les éléments

Le remplacement des éléments est le même processus que dans l'exemple ci-dessus.

  1. Liste les objets de vue qui peuvent être obtenus avec la méthode items() en utilisant list().
  2. Remplacer les éléments d'une liste
  3. Créer un nouvel objet en le passant au constructeur collections.OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

Si vous voulez spécifier une clé et la remplacer, utilisez la méthode index() pour obtenir l'index (position) dans la liste des clés, comme indiqué ci-dessous.

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

Trier les éléments par clé ou par valeur

Créez une liste de tuples (key, value) de paires clé-valeur triées basée sur l'objet de vue qui peut être obtenu par la méthode items(), et passez-la au constructeur collections.OrderedDict() pour créer un nouvel objet.

Le tri est effectué en spécifiant une fonction anonyme (expression lambda) qui renvoie une clé ou une valeur à partir d'un tuple (clé, valeur) comme argument clé de la fonction intégrée sorted().

Si vous voulez inverser l'ordre, mettez l'argument inverse de sorted() à true.

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])
Copied title and URL