2012-02-29 14 views
7

ho cercando di stampare un dizionario in Python:Come implementare un array associativo (non dizionario) in Python?

Dictionary = {"Forename":"Paul","Surname":"Dinh"} 
for Key,Value in Dictionary.iteritems(): 
    print Key,"=",Value 

Anche se la voce "Forename" è nominata per prima, ma dizionari in Python sembrano essere ordinati per valori, quindi il risultato è come questo:

Surname = Dinh 
Forename = Paul 

come stampare questi con lo stesso ordine in codice o l'ordine quando gli elementi vengono aggiunti a (non ordinati per valori né per i tasti)?

+3

è possibile utilizzare un ulteriore elenco di chiavi per determinare l'ordine – Nobody

+0

sto pensando di utilizzare 2 elenchi (array Python), quindi utilizzare "enumerate", ma questo è complesso – jondinham

+3

Hai anche bisogno della possibilità di accedervi rapidamente tramite chiave? –

risposta

15

È possibile utilizzare un elenco di tuple (o un elenco di elenchi). Come questo:

Arr= [("Forename","Paul"),("Surname","Dinh")] 
for Key,Value in Arr: 
    print Key,"=",Value 

Forename = Paul 
Surname = Dinh 

si può fare un dizionario di questo con:

Dictionary=dict(Arr) 

E le chiavi correttamente ordinati in questo modo:

keys = [k for k,v in Arr] 

Poi fare questo:

for k in keys: print k,Dictionary[k] 

ma concordo con i commenti sulla tua domanda: non sarebbe facile ordinare le chiavi nell'ordine richiesto al momento del ciclo?

EDIT: (grazie Rik Poggi), OrderedDict lo fa per voi:

od=collections.OrderedDict(Arr) 
for k in od: print k,od[k] 
+0

è corretto usare: Arr = [["Nome", "Paul"], ["Cognome", "Dinh"]]? – jondinham

+3

elenco di tuple è come 'OrderedDict's sono implementati, se il dizionario è la struttura che l'OP sta cercando, il dovrebbe solo usarli e salvare il dolore di conversione ogni volta. –

+1

@RikPoggi. Ah, ha aggiunto quello. –

3

'ma dizionari in Python sono allineati secondo valori' forse mi sbaglio qui, ma che gioco quell'ideea? I dizionari non sono ordinati per nulla.

Si avranno due soluzioni: mantenere un elenco di chiavi aggiuntive al dizionario o utilizzare una struttura di dati diversa come un array o array.

4

Questo può soddisfare il vostro bisogno di meglio:

Dictionary = {"Forename":"Paul","Surname":"Dinh"} 
KeyList = ["Forename", "Surname"] 
for Key in KeyList: 
    print Key,"=",Dictionary[Key] 
+0

ma per la maggior parte del tempo non mi sembra di conoscere l'elenco delle chiavi – jondinham

+1

Quindi come fai a sapere il tipo :) –

+0

c'è un caso: diciamo che il 'Dizionario' mi è passato da una funzione. e voglio mantenere l'ordine dei valori creati da quella funzione (tramite 'append' ad esempio) – jondinham

16

Prima di tutto i dizionari non vengono ordinati né per chiave né per valore.

E in base alla descrizione. È necessario actualy collections.OrderedDict modulo

from collections import OrderedDict 

my_dict = OrderedDict([("Forename", "Paul"), ("Surname", "Dinh")]) 

for key, value in my_dict.iteritems(): 
    print '%s = %s' % (key, value) 

Si noti che è necessario creare un'istanza OrderedDict dalla lista di tuple non da un altro dict come dict esempio provvederà a mischiare l'ordine degli elementi, prima OrderedDict verrà creata un'istanza.

+0

Quindi, a partire da Python 3.6 dicts mantiene l'ordine delle chiavi. – lig

3

mi chiedo se si tratta di un dict ordinato che si desidera:

>>> k = "one two three four five".strip().split() 
>>> v = "a b c d e".strip().split() 
>>> k 
    ['one', 'two', 'three', 'four', 'five'] 
>>> v 
    ['a', 'b', 'c', 'd', 'e'] 
>>> dx = dict(zip(k, v)) 
>>> dx 
    {'four': 'd', 'three': 'c', 'five': 'e', 'two': 'b', 'one': 'a'} 
>>> for itm in dx: 
     print(itm) 

    four 
    three 
    five 
    two 
    one 

>>> # instantiate this data structure from OrderedDict class in the Collections module 
>>> from Collections import OrderedDict 
>>> dx = OrderedDict(zip(k, v)) 
>>> for itm in dx: 
     print(itm) 

    one 
    two 
    three 
    four 
    five 

Un dizionario creato utilizzando l'OrderdDict conserva l'ordine originale di inserzione.

In altre parole, tale dizionario esegue un'iterazione sulle coppie chiave/valore in base all'ordine in cui sono stati inseriti.

Così, per esempio, quando si elimina una chiave e quindi aggiungere nuovamente lo stesso tasto, l'ordine di iterazione è modifiche:

>>> del dx['two'] 
>>> for itm in dx: 
     print(itm) 

     one 
     three 
     four 
     five 

>>> dx['two'] = 'b' 
>>> for itm in dx: 
     print(itm) 

     one 
     three 
     four 
     five 
     two 
+0

Perché non usare il codice dalla domanda? – lig

+0

è necessario per capire la mia risposta? In effetti, non ho usato i dati di esempio dell'OP per due ragioni: (i) stiamo parlando di sequenze ordinate qui e i dati dell'OP hanno solo * due * coppie di valori-chiave; e (ii) ho scelto chiavi e valori per i miei dati di esempio che consentono al lettore di vedere facilmente il punto del mio codice, ad esempio la conservazione dell'ordine. – doug

Problemi correlati