A partire da Python 3.6 verrà ordinato il dict incorporato
Buone notizie, quindi il caso d'uso originale dell'OP di coppie di mapping recuperate da un database con ID stringa univoci come chiavi e valori numerici come valori in un dict Python v3.6 + integrato, dovrebbe ora rispettare l'ordine di inserimento.
Se dico le risultanti espressioni della tabella di due colonne da una query del database come:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
verrebbe memorizzato in due tuple Python, k_seq e v_seq (allineati per indice numerico e con la stessa lunghezza del corso), quindi:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Consentire l'output in seguito come:
for k, v in ordered_map.items():
print(k, v)
cedendo in questo caso (per il nuovo dict incorporato di Python 3.6+!):
foo 0
bar 1
baz 42
nello stesso ordine per valore di v.
Dove nell'installazione di Python 3.5 sulla mia macchina attualmente produce:
bar 1
foo 0
baz 42
Dettagli:
Come proposto nel 2012 da Raymond Hettinger (cfr. Mail su Python-dev con soggetto "Dizionari più compatti con iterazione più veloce" ) e ora (nel 2016) annunciato in una mail di Victor Stinner a python-dev con soggetto "Python 3.6 dict diventa compatta e ottiene una versione privata e le parole chiave vengono ordinate "a causa della correzione / implementazione del problema 27350 " Compatto e ordinato " in Python 3.6 ora saremo in grado di usare un dict incorporato per mantenere l'ordine di inserimento !!
Speriamo che questo porti a un'implementazione di OrderedDict a livello sottile come primo passo. Come indicato da @ JimFasarakis-Hilliard, alcuni vedranno casi d'uso per il tipo OrderedDict anche in futuro. Penso che la comunità di Python in generale esaminerà attentamente, se questo resisterà alla prova del tempo e quali saranno i prossimi passi.
È tempo di ripensare le nostre abitudini di codifica per non perdere le possibilità aperte da un ordinamento stabile di:
- Argomenti di parole chiave e
- archiviazione (intermedia) di dict
Il primo perché facilita l'invio nell'implementazione di funzioni e metodi in alcuni casi.
Il secondo, in quanto incoraggia a utilizzare più facilmente dict
s come memoria intermedia nelle condotte di elaborazione.
Raymond Hettinger ha gentilmente fornito la documentazione che spiega " The Tech Behind Python 3.6 Dictionaries " - dalla sua presentazione del gruppo Meetup di San Francisco Python 2016-DEC-08.
E forse alcune pagine di domande e risposte decorate con Stack Overflow riceveranno varianti di queste informazioni e molte risposte di alta qualità richiedono anche un aggiornamento per versione.
Caveat Emptor (ma vedi anche sotto aggiornamento 2017-12-15):
Come giustamente osserva @ajcr: "L'aspetto che preserva l'ordine di questa nuova implementazione è considerato un dettaglio dell'implementazione e non dovrebbe essere invocato". (dal whatsnew36 ) non nit picking, ma la citazione è stata un po 'pessimistica ;-). Continua come "(questo potrebbe cambiare in futuro, ma si desidera avere questa nuova implementazione di dict nella lingua per alcune versioni prima di cambiare le specifiche della lingua per imporre la semantica di conservazione dell'ordine per tutte le implementazioni Python attuali e future; anche questo aiuta a preservare la retrocompatibilità con le versioni precedenti del linguaggio in cui l'ordine di iterazione casuale è ancora in vigore, ad esempio Python 3.5). "
Così come in alcune lingue umane (ad esempio il tedesco), l'uso modella la lingua e la volontà è stata dichiarata ... in whatsnew36 .
Aggiornamento 15-12-2017:
In una mail all'elenco python-dev , Guido van Rossum dichiarò:
Rendilo così. "Dict mantiene l'ordine di inserimento" è la sentenza. Grazie!
Quindi, l'effetto collaterale CPython versione 3.6 dell'ordine di inserimento di dict ora sta diventando parte delle specifiche del linguaggio (e non più solo un dettaglio di implementazione). Quel thread di posta emerse anche alcuni obiettivi di progettazione distintivi per collections.OrderedDict
come ricordato da Raymond Hettinger durante la discussione.