Estou um pouco intrigado com o seguinte código:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print key, 'corresponds to', d[key]
O que eu não entendo é a key
parte. Como o Python reconhece que precisa apenas ler a chave do dicionário? Existe key
uma palavra especial em Python? Ou é simplesmente uma variável?
python
python-2.7
dictionary
TopChef
fonte
fonte
Respostas:
key
é apenas um nome de variável.simplesmente fará um loop sobre as chaves no dicionário, em vez das chaves e valores. Para fazer um loop sobre a chave e o valor, você pode usar o seguinte:
Para Python 3.x:
Para Python 2.x:
Para testar você mesmo, altere a palavra
key
parapoop
.No Python 3.x,
iteritems()
foi substituído por simplyitems()
, que retorna uma visão de conjunto apoiada pelo dict, comoiteritems()
ainda melhor. Isto também está disponível em 2.7 asviewitems()
.A operação
items()
funcionará para 2 e 3, mas em 2 retornará uma lista dos(key, value)
pares do dicionário , que não refletirão alterações no ditado que ocorrem após aitems()
chamada. Se você deseja o comportamento 2.x no 3.x, pode ligarlist(d.items())
.fonte
sorted
são necessários para estabilizá-lo.Keys and values are iterated over in insertion order.
[ docs.python.org/3/library/…Não é que chave seja uma palavra especial, mas que os dicionários implementam o protocolo do iterador. Você pode fazer isso em sua classe, por exemplo, veja esta pergunta sobre como criar iteradores de classe.
No caso de dicionários, é implementado no nível C. Os detalhes estão disponíveis no PEP 234 . Em particular, a seção intitulada "Dicionário Iteradores":
Em Python 3,
dict.iterkeys()
,dict.itervalues()
edict.iteritems()
não são mais suportados. Use edict.keys()
, em vez disso.dict.values()
dict.items()
fonte
A iteração sobre uma
dict
iteração através de suas chaves em nenhuma ordem específica, como você pode ver aqui:Edit: (Este não é mais o caso do Python3.6 , mas observe que ainda não é um comportamento garantido )
Para o seu exemplo, é uma idéia melhor usar
dict.items()
:Isso fornece uma lista de tuplas. Quando você faz um loop sobre eles dessa maneira, cada tupla é descompactada
k
ev
automaticamente:Usar
k
ev
como nomes de variáveis ao fazer um loop sobre umdict
é bastante comum se o corpo do loop tiver apenas algumas linhas. Para loops mais complicados, pode ser uma boa ideia usar nomes mais descritivos:É uma boa idéia adquirir o hábito de usar strings de formato:
fonte
key
é simplesmente uma variável.Para Python2.X :
... ou melhor,
Para Python3.X :
fonte
Quando você itera pelos dicionários usando a
for .. in ..
sintaxe-, sempre itera sobre as chaves (os valores são acessíveis usandodictionary[key]
).Para iterar sobre pares de valores-chave, use o Python 2
for k,v in s.iteritems()
e o Python 3for k,v in s.items()
.fonte
items()
vez deiteritems()
Esse é um idioma de loop muito comum.
in
é um operador. Para saber quando usarfor key in dict
e quando deve serfor key in dict.keys()
consulte o artigo Idiomatic Python de David Goodger (cópia arquivada) .fonte
in
, a parte do operador é onde você verifica a existência . Talvez seja melhor excluir essasin is an operator
informações.Não são apenas
for
loops. A palavra importante aqui é "iterando".Um dicionário é um mapeamento de chaves para valores:
Sempre que iteramos sobre ele, iteramos sobre as chaves. O nome da variável
key
é apenas para ser descritivo - e é bastante adequado para esse propósito.Isso acontece na compreensão de uma lista:
Isso acontece quando passamos o dicionário para a lista (ou qualquer outro objeto de tipo de coleção):
A maneira como o Python itera é, em um contexto em que precisa, chama o
__iter__
método do objeto (neste caso, o dicionário) que retorna um iterador (neste caso, um objeto keyiterator):Nós não devemos usar esses métodos especiais, em vez disso, use a respectiva função interna para chamá-la
iter
:Os iteradores têm um
__next__
método - mas nós o chamamos com a função embutidanext
:Quando um iterador está esgotado, ele aumenta
StopIteration
. É assim que o Python sabe sair de umfor
loop, de uma compreensão de lista, de uma expressão geradora ou de qualquer outro contexto iterativo.StopIteration
Quando um iterador aumenta, ele sempre será aumentado - se você quiser iterar novamente, precisará de um novo.Voltando aos ditados
Já vimos ditados interagindo em muitos contextos. O que vimos é que sempre que iteramos sobre um ditado, obtemos as chaves. De volta ao exemplo original:
Se mudarmos o nome da variável, ainda obteremos as chaves. Vamos tentar:
Se queremos iterar sobre os valores, precisamos usar o
.values
método dict, ou para os dois juntos.items
:No exemplo dado, seria mais eficiente iterar sobre os itens como este:
Mas, para fins acadêmicos, o exemplo da pergunta é ótimo.
fonte
Eu tenho um caso de uso em que tenho que percorrer o dict para obter a chave, par de valores e também o índice indicando onde estou. É assim que eu faço:
Observe que, entre parênteses em torno da chave, o valor é importante; sem os parênteses, você obtém um ValueError "sem valores suficientes para descompactar".
fonte
Você pode verificar a implementação do CPython
dicttype
no GitHub. Esta é a assinatura do método que implementa o iterador dict:CPython dictobject.c
fonte
Para iterar sobre as teclas, é mais lento, mas melhor de usar
my_dict.keys()
. Se você tentou fazer algo assim:isso criaria um erro de tempo de execução porque você está alterando as chaves enquanto o programa está sendo executado. Se você está absolutamente decidido a reduzir o tempo, use o
for key in my_dict
caminho, mas foi avisado;).fonte
Isso imprimirá a saída em ordem classificada por valores em ordem crescente.
Resultado:
fonte