2009-12-04 3 views

risposta

31

Ecco cosa dict.items()documentation dice:

dict.items() restituiscono una copia della lista del dizionario di coppie (chiave, valore).

Se item(), keys(), values ​​(), iteritems(), iterkeys() e itervalues ​​() vengono chiamati senza modifiche intermedie al dizionario, gli elenchi corrisponderanno direttamente.

Penso che sia ragionevole supporre che l'ordine degli articoli non cambierà se tutto ciò che fai è iterazione.

+9

Non c'è bisogno di assumere: la documentazione ti dice esplicitamente che l'ordine non cambierà se tutto ciò che fai è interation! –

+0

questo effettivamente risponde alla domanda quindi dovrebbe essere la risposta = P. il tendayi è comunque utile – Claudiu

2

Un dizionario Python non ha alcun concetto di ordine. Quindi non puoi dipendere da un ordine specifico durante l'iterazione.

Questo è intenzionale: poiché si tratta di una mappa di hash, è inevitabile se si desidera "ricerche rapide"!

+1

true, ma c'è qualche ordine sottostante che ottieni quando chiami .iterkeys() o .itervalues ​​(). La mia domanda è: sarà conservata se il dict non viene modificato? – Claudiu

+0

Dipende dall'implementazione, ma non viene fornita alcuna garanzia. Sembra che CPython faccia sempre (basato su osservazioni passate e su un test molto limitato) restituisca le chiavi/valori/elementi nello stesso ordine. Se hai bisogno che l'ordine sia garantito, usa semplicemente un'implementazione OrderedDict, di cui puoi trovare molti in natura. –

+0

Fondamentalmente, MCCutchen ha risposto: usa un OrderedDict se vuoi fare affidamento su un ordine mentre iterazione di un dict, non puoi contare su un comando "standard". – ChristopheD

2

Potrebbe essere conservato in alcune implementazioni, ma non contare su di esso, in quanto non fa parte della specifica Dict.

+1

Se segui il link alla specifica Dict.nella risposta di John Machin, vedrai che la specifica Dict GARANTISCE che l'ordine di iterazione non cambierà se non modifichi il contenuto. Ciò su cui non puoi contare è che l'ordine sarà coerente tra le implementazioni. –

1

Come ha detto Christophe, un dizionario viene utilizzato per organizzare coppie chiave/valore a causa del tempo di accesso rapido che fornisce. Se l'applicazione richiede un indice fisso, è necessario esaminare le altre strutture di dati che forniscono un ordine specifico/noto.

Detto questo, dovrebbe essere lecito ritenere che l'ordine non cambia a meno che non vengono aggiunti elementi (non ci sarebbe nessun punto per fare questa operazione costosa del rimpasto roba), ecc, ma, ancora una volta, no fare affidamento su di esso.

5

Sì. Non è coinvolta la randomizzazione. C'è una garanzia ancora più forte - vedi here.

+0

Non downvoting, ma dal tuo link: 'ordine arbitrario che è .../snip/varia attraverso le implementazioni Python,' Se vuoi che il tuo codice sia portatile, non fare affidamento su un ordinamento dict. Cosa succede se cambiano l'implementazione dict nella prossima implementazione CPython? – ChristopheD

+0

Come ho scritto nella mia risposta, * questa è l'implementazione specifica *. altre implementazioni potrebbero non garantire questo. quindi se utilizzi questa proprietà, in realtà stai rinunciando alla portabilità. –

+1

@Ori Raviv: Tutto quello che sta chiedendo è che otterrà lo stesso risultato se lui lo fa "per key in some_dict' due volte se non perturba il ditt nel frattempo. Questa è una semplice garanzia. Se non fosse vero, la garanzia più complessa da dare ai documenti che ho collegato non sarebbe possibile. –

12

Lo standard Python dict come la maggior parte delle implementazioni non conserva l'ordinamento in quanto gli elementi di solito sono accessibili tramite la chiave.

Tuttavia, l'iterazione prevedibile è talvolta utile e in Python 3.1 il modulo collections contiene un OrderedDict che preserva l'ordine con un sovraccarico minimo delle prestazioni.

+0

Questa è probabilmente la soluzione migliore, più sicura e più conforme agli standard per le persone interessate a mantenere l'ordine in un "dettato". Il cinque! – jathanism

+0

sì, questo sarebbe il modo giusto per farlo – Claudiu

+0

@Claudiu: Non hai ancora capito cosa è il "it" che vuoi fare. –

4

collections.OrderedDict sarà disponibile in Python 2.7 oltre a Python 3.1.

Per versioni Python precedenti alla 2.7, c'è collective.ordereddict su PyPI e Django ha un'implementazione SortedDict.