2011-08-01 6 views
26

Possiamo conoscere la posizione degli elementi nel dizionario ordinato di Python? Per esempio:Come conoscere la posizione degli elementi nel dizionario ordinato di Python

Se ho dizionario:

// Ordered_dict is OrderedDictionary 

Ordered_dict = {"fruit": "banana", "drinks": "water", "animal": "cat"} 

Ora come sapere in quale posizione gatto appartiene? E 'possibile ottenere una risposta del tipo:

position (Ordered_dict["animal"]) = 2 ? o in qualche altro modo?

+7

Il tuo dizionario non è un dittato ordinato: è un semplice python non ordinato. –

+8

Solo perché lo chiami ordinato, non ne fa uno! – Jacob

risposta

49

Si può ottenere l'elenco di chiavi con la proprietà keys:

In [20]: d=OrderedDict((("fruit", "banana"), ("drinks", 'water'), ("animal", "cat"))) 

In [21]: d.keys().index('animal') 
Out[21]: 2 

una migliore performance potrebbe essere raggiunto con l'uso di iterkeys() però.

Per coloro che utilizzano Python 3

>>> list(x.keys()).index("c") 
1 
+23

'list (d.keys()). Index ('animal')' per chiunque usi ** Python3 ** finendo qui. – Torxed

+6

Sembra che semplicemente usando 'list (d) .index ('animal')' funzioni anche in Python 3, a meno che mi manchi qualcosa. – Marein

+0

Per python 3 consultare: https://stackoverflow.com/q/44147047/281545 –

3

pensare prima che è necessario è quello di leggere la documentazione. Se si apre python tutorial e poi cercare di trovare informazioni su OrderedDict si vedrà la seguente:

classe collections.OrderedDict ([Voci]) - restituire un'istanza di un dict sottoclasse, sostenendo i soliti metodi dict. Un OrderedDict è un dict che ricorda l'ordine in cui le chiavi sono state inserite per la prima volta. Se una nuova voce sovrascrive una voce esistente, la posizione di inserimento originale viene lasciata invariata . Cancellando una voce e reinserendola, la sposterà alla fine di .

Novità nella versione 2.7.

Quindi, nel caso in cui si utilizzi un dizionario ordinato e non si cancelleranno le chiavi, "animale" sarà sempre nella posizione che si aggiunge, ad es. Indice 2.

anche per ottenere un indice di un 'gatto' si può utilizzare semplicemente:

from collections import OrderedDict 
d = OrderedDict((("fruit", "banana"), ("drinks", "water"), ("animal", "cat"))) 
d.keys() 
>>> ['fruit', 'drinks', 'animal'] 
d.values() 
>>> ['banana', 'water', 'cat'] 
# So 
d.values().index('cat') 
>>> 2 
2

Per python3: tuple(d).index('animal')

Questa è quasi la stessa risposta di Marein sopra, ma usa un tupla immutabile invece di una lista mutabile. Quindi dovrebbe funzionare un po 'più veloce (~ 12% più veloce nel mio controllo di sanità veloce).

+0

Si noti che questo funziona anche in Python 2 (la tupla (d) esegue semplicemente un'iterazione sui tasti del dizionario e produce una tupla) –