Considere um ditado como
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
Como faço para acessar, por exemplo, um determinado elemento deste dicionário? por exemplo, gostaria de imprimir o primeiro elemento após alguma formatação do primeiro elemento da Apple que, em nosso caso, é apenas 'americano'?
Informações adicionais A estrutura de dados acima foi criada analisando um arquivo de entrada em uma função Python. Uma vez criado, no entanto, ele permanece o mesmo para aquela execução.
Estou usando essa estrutura de dados em minha função.
Portanto, se o arquivo for alterado, da próxima vez que este aplicativo for executado, o conteúdo do arquivo será diferente e, portanto, o conteúdo desta estrutura de dados será diferente, mas o formato será o mesmo. Então, veja, em minha função, não sei se o primeiro elemento na Apple é 'americano' ou qualquer outra coisa, então não posso usar 'americano' diretamente como uma chave.
fonte
dict
. A palavra 'dict' já é uma palavra-chave em Python. Use outra coisa, comomydict
.Respostas:
Por se tratar de um dicionário, você acessa através das teclas. Armazenando o dicionário em "Apple", faça o seguinte:
E pegando quantos deles são americanos (16), faça assim:
fonte
.keys()
para acessá-las dinamicamente."n"
em uma profundidade desconhecida, armazenado em um elemento desconhecido.Se a pergunta for, se eu sei que tenho um ditado que contém 'Maçã' como uma fruta e 'Americano' como um tipo de maçã, eu usaria:
como outros sugeriram. Se, em vez disso, a pergunta for: você não sabe se 'Apple' como uma fruta e 'American' como um tipo de 'Apple' existem quando você lê um arquivo arbitrário em sua estrutura de dados dict, você poderia fazer algo como:
ou melhor ainda, para que você não itere desnecessariamente sobre todos os ditos se souber que apenas a Apple tem o tipo americano:
Em todos esses casos, não importa a ordem em que os dicionários realmente armazenam as entradas. Se você estiver realmente preocupado com o pedido, considere usar
OrderedDict
:http://docs.python.org/dev/library/collections.html#collections.OrderedDict
fonte
Como notei sua descrição, você só sabe que seu analisador lhe dará um dicionário que seus valores também são dicionários assim:
Portanto, você deve iterar em seu dicionário pai. Se você deseja imprimir ou acessar todas as primeiras chaves do dicionário na
sampleDict.values()
lista, você pode usar algo assim:Se você deseja acessar apenas a primeira chave do primeiro item
sampleDict.values()
, isso pode ser útil:Se você usar o exemplo que deu na pergunta, quero dizer:
A saída para o primeiro código é:
E a saída para o segundo código é:
fonte
Como bônus, gostaria de oferecer uma solução diferente para o seu problema. Você parece estar lidando com dicionários aninhados, o que geralmente é tedioso, especialmente quando você precisa verificar a existência de uma chave interna.
Existem algumas bibliotecas interessantes sobre isso no pypi, aqui está uma busca rápida para você.
No seu caso específico, dict_digger parece adequado.
fonte
Você pode usar
dict['Apple'].keys()[0]
para obter a primeira chave doApple
dicionário, mas não há garantia de que seráAmerican
. A ordem das chaves em um dicionário pode mudar dependendo do conteúdo do dicionário e da ordem em que as chaves foram adicionadas.fonte
OrderedDict
nacollections
bibliotecaEu sei que tenho 8 anos, mas parece que ninguém realmente leu e respondeu à pergunta.
Você pode chamar .values () em um dict para obter uma lista dos dicts internos e, assim, acessá-los por índice.
fonte
'dict_values' object does not support indexing
. Acho que esta resposta precisa de uma atualização, já que você precisa envolver dict_values para recuperar uma listaVocê não pode confiar na ordem dos dicionários. Mas você pode tentar isso:
Se quiser que o pedido seja preservado, use: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api
fonte
Exemplo simples para entender como acessar os elementos do dicionário: -
Crie um dicionário
Explore mais sobre os dicionários Python e aprenda interativamente aqui ...
fonte
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 comomydict[mydict.keys()[0]]
(Python 2 apenas, já que em Python 3keys()
é 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
você pode usar:
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: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.
fonte
Com a seguinte função pequena, cavar em um dicionário em forma de árvore se torna muito fácil:
Agora,
dig(mydict, "Apple.Mexican")
retorna10
, enquantodig(mydict, "Grape")
produz a subárvore{'Arabian':'25','Indian':'20'}
. Se uma chave não estiver contida no dicionário,dig
retornaNone
.Observe que você pode facilmente alterar (ou mesmo parametrizar) o caractere separador de '.' para '/', '|' etc.
fonte