Poche persone sembrano, nonostante le molte risposte a questa domanda, abbiano sottolineato che i dizionari sono mappature non ordinate, e così (fino alla benedizione dell'ordine di inserzione con Python 3.7) l'idea della "prima" voce in un dizionario è letteralmente fatta senza senso. E anche a è OrderedDict
possibile accedere solo tramite indice numerico utilizzando bruttezze come mydict[mydict.keys()[0]]
(solo Python 2, poiché in Python 3 keys()
è un iteratore non sottoscrivibile.)
Da 3.7 in poi e in pratica anche in 3.6 - il nuovo comportamento è stato introdotto allora, ma non è stato incluso come parte della specifica del linguaggio fino a 3.7 - iterazione sulle chiavi, valori o elementi di un dict (e, credo, un impostato anche) produrrà per primi gli oggetti inseriti meno di recente. Non esiste ancora un modo semplice per accedervi tramite indice numerico di inserimento.
Per quanto riguarda la questione della selezione e della "formattazione" degli elementi, se si conosce la chiave che si desidera recuperare nel dizionario, normalmente la si utilizzerà come pedice per recuperarla ( my_var = mydict['Apple']
).
Se vuoi davvero essere in grado di indicizzare gli elementi in base al numero di voce (ignorando il fatto che il numero di una voce particolare cambierà man mano che vengono effettuati gli inserimenti), la struttura appropriata sarebbe probabilmente un elenco di tuple di due elementi. Invece di
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
potresti usare:
mylist = [
('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
('Grapes', {'Arabian': '25', 'Indian': '20'}
]
In questo regime la prima voce è mylist[0]
nella classica forma elencata e il suo valore è ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. È possibile scorrere l'intero elenco come segue:
for (key, value) in mylist: # unpacks to avoid tuple indexing
if key == 'Apple':
if 'American' in value:
print(value['American'])
ma se sai che stai cercando la chiave "Apple", perché non dovresti usare un dict invece?
È possibile introdurre un ulteriore livello di riferimento indiretto memorizzando nella cache l'elenco di chiavi, ma la complessità di mantenere sincronizzate due strutture di dati aumenterebbe inevitabilmente la complessità del codice.