Una soluzione moderna e veloce, per Python 3.7. Può funzionare anche su alcuni interpreti di Python 3.6.
TLDR
Per ordinare un dizionario da usare i tasti:
sorted_dict = {k: disordered[k] for k in sorted(disordered)}
quasi tre volte più veloce la risposta accettata; probabilmente di più quando includi le importazioni.
Commenta la risposta accettata
L'esempio nella risposta accettata non utilizza il parametro di key
per sorted()
che (concesso, sembra piacevole e richiede meno battitura) è più lento sia come elementi di tuple generate (key, value)
sono rispetto. Poiché i dizionari Python non possono avere due elementi con la stessa chiave, non è necessario utilizzare il secondo elemento della tupla per il confronto.
Come Ordina per chiave in Python 3,7
Il grande cambiamento in Python 3.7 è che the dictionaries are now ordered by default.
- È possibile generare dict ordinato utilizzando le comprensioni del testo.
- L'utilizzo di
OrderedDict
potrebbe comunque essere preferibile per motivi di compatibilità.
- Non utilizzare
sorted(d.items())
senza key
.
See:
disordered = {10: 'b', 3: 'a', 5: 'c'}
# sort keys, then get values from original - fast
sorted_dict = {k: disordered[k] for k in sorted(disordered)}
# key = itemgetter - slower
from operator import itemgetter
key = itemgetter(0)
sorted_dict = {k: v for k, v in sorted(disordered.items(), key=key)}
# use key = lambda - the slowest
key = lambda item: item[0]
sorted_dict = {k: v for k in sorted(disordered.items(), key=key)}
Generalmente
Timing risultati:
Best for {k: d[k] for k in sorted(d)}: 7.507327548999456
Best for {k: v for k, v in sorted(d.items(), key=key_getter)}: 12.031082626002899
Best for {k: v for k, v in sorted(d.items(), key=key_lambda)}: 14.22885995300021
Best for dict(sorted(d.items(), key=key_getter)): 11.209122000000207
Best for dict(sorted(d.items(), key=key_lambda)): 13.289728325995384
Best for dict(sorted(d.items())): 14.231471302999125
Best for OrderedDict(sorted(d.items(), key=key_getter)): 16.609151654003654
Best for OrderedDict(sorted(d.items(), key=key_lambda)): 18.52622927199991
Best for OrderedDict(sorted(d.items())): 19.436101284998585
Testing codice:
from timeit import repeat
setup_code = """
from operator import itemgetter
from collections import OrderedDict
import random
random.seed(0)
d = {i: chr(i) for i in [random.randint(0, 120) for repeat in range(120)]}
key_getter = itemgetter(0)
key_lambda = lambda item: item[0]
"""
cases = [
# fast
'{k: d[k] for k in sorted(d)}',
'{k: v for k, v in sorted(d.items(), key=key_getter)}',
'{k: v for k, v in sorted(d.items(), key=key_lambda)}',
# slower
'dict(sorted(d.items(), key=key_getter))',
'dict(sorted(d.items(), key=key_lambda))',
'dict(sorted(d.items()))',
# the slowest
'OrderedDict(sorted(d.items(), key=key_getter))',
'OrderedDict(sorted(d.items(), key=key_lambda))',
'OrderedDict(sorted(d.items()))',
]
for code in cases:
times = repeat(code, setup=setup_code, repeat=3)
print(f"Best for {code}: {min(times)}")
Cosa intendi con "non è possibile creare un dizionario da questa lista ordinata"? Un dizionario è non ordinato per definizione. Se vuoi un dizionario ordinato, guarda [Dizionari ordinati] (http://docs.python.org/release/3.1.5/whatsnew/3.1.html#pep-372-ordered-dictionaries). – inspectorG4dget
+1 perché ricordo di aver avuto questo stesso problema (qualche tempo fa prima che OrderedDict fosse ufficialmente inserito in collezioni!) E ricordo la frustrazione ... – jsh