Poucas pessoas parecem, apesar das muitas respostas a esta pergunta, ter apontado que os dicionários são mapeamentos não ordenados, e assim (até a bênção da ordem de inserção com Python 3.7) a ideia da "primeira" entrada em um dicionário feito literalmente não faz sentido. E mesmo um OrderedDict
só pode ser acessado por índice numérico usando feiúras como mydict[mydict.keys()[0]]
(Python 2 apenas, já que em Python 3 keys()
é um iterador não subscritível.)
Do 3.7 em diante e na prática também do 3.6 - o novo comportamento foi introduzido então, mas não incluído como parte da especificação da linguagem até o 3.7 - iteração sobre as chaves, valores ou itens de um dicionário (e, eu acredito, um definido também) produzirá primeiro os objetos inseridos menos recentemente. Ainda não existe uma maneira simples de acessá-los por índice numérico de inserção.
Quanto à questão de selecionar e "formatar" itens, se você souber a chave que deseja recuperar no dicionário, normalmente utilizaria a chave como um subscrito para recuperá-la ( my_var = mydict['Apple']
).
Se você realmente deseja indexar os itens pelo número da entrada (ignorando o fato de que o número de uma entrada em particular mudará conforme as inserções são feitas), então a estrutura apropriada provavelmente seria uma lista de tuplas de dois elementos. Ao invés de
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
você pode usar:
mylist = [
('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
('Grapes', {'Arabian': '25', 'Indian': '20'}
]
Sob esse regime, a primeira entrada está mylist[0]
na forma clássica com terminação de lista e seu valor é ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. Você pode iterar em toda a lista da seguinte maneira:
for (key, value) in mylist: # unpacks to avoid tuple indexing
if key == 'Apple':
if 'American' in value:
print(value['American'])
mas se você sabe que está procurando a chave "Apple", por que não usar um dict?
Você poderia introduzir um nível adicional de indireção armazenando em cache a lista de chaves, mas as complexidades de manter duas estruturas de dados em sincronização inevitavelmente aumentariam a complexidade de seu código.