OrderedDict - Ricorda l'Ordine con il Quale Si Aggiungono Chiavi a un Dizionario

Scopo: Un OrderedDict è una sottoclasse di dict che ricorda l'ordine nel quale sono aggiunti i propri contenuti.

Un OrderedDict è una sottoclasse di dict che ricorda l'ordine nel quale sono aggiunti i propri contenuti.

# collections_ordereddict_iter.py

import collections

print('Dizionario Normale:')
d = {}
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

print('\nOrderedDict:')
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

Un normale dict non tiene traccia dell'ordine di inserimento, e l'iterazione sull'oggetto produce i valori nell'ordine basato su come le chiavi sono conservate nella tabella hash; detto ordine è a sua volta influenzato da un valore casuale utilizzato per ridurre collisioni. Al contrario, in un OrderedDict l'ordine nel quale gli elementi sono inseriti viene conservato e utilizzato quando si crea un iteratore.

$ python3 collections_ordereddict_iter.py
Dizionario Normale:
c C
b B
a A

OrderedDict:
a A
b B
c C

Uguaglianza

Un normale dict cerca il suo contenuto quando deve verificare una uguaglianza. Un OrderedDict considera anche l'ordine nel quale sono stati aggiunti gli elementi.

# collections_ordereddict_equality.py

import collections

print('dict       :',)
d1 = {}
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'

d2 = {}
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'

print(d1 == d2)

print('OrderedDict:',)

d1 = collections.OrderedDict()
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'

d2 = collections.OrderedDict()
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'

print(d1 == d2)

In questo caso, visto che i due OrderedDict sono creati da valori immessi in diverso ordine, sono considerati diversi.

$ python3 collections_ordereddict_equality.py

dict       :
True
OrderedDict:
False

Riordinare

E' possibile modificare l'ordine delle chiavi in un OrderedDict spostandole all'inizio o alla fine della sequenza utilizzando move_to_end().

# collections_ordereddict_move_to_end.py
import collections

d = collections.OrderedDict(
    [('a', 'A'), ('b', 'B'), ('c', 'C')]
)

print('Prima:')
for k, v in d.items():
    print(k, v)

d.move_to_end('b')

print('\nmove_to_end():')
for k, v in d.items():
    print(k, v)

d.move_to_end('b', last=False)

print('\nmove_to_end(last=False):')
for k, v in d.items():
    print(k, v)

L'argomento last indica a move_to_end() la direzione di spostamento dell'elemento che sarà l'ultimo nella sequenza se True oppure il primo se False.

3 collections_ordereddict_move_to_end.py

Prima:
a A
b B
c C

move_to_end():
a A
c C
b B

move_to_end(last=False):
b B
a A
c C

Vedere anche:

OrderedDict
La documentazione della libreria standard per questo modulo
PYTHONHASHSEED
Variabile di ambiente per controllare il seme del valore casuale aggiunto all'algoritomo di hash per la locazione delle chiavi nel dizionario.
Indice articolo: