Parece que as listas retornadas keys()
e os values()
métodos de um dicionário são sempre um mapeamento 1 para 1 (assumindo que o dicionário não seja alterado entre chamar os 2 métodos).
Por exemplo:
>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
print d[k[i]] == v[i]
True
True
True
Se você não alterar o dicionário entre chamadas keys()
e chamadas values()
, é errado assumir que o loop for acima sempre imprimirá True? Não encontrei nenhuma documentação confirmando isso.
Respostas:
Encontrou isto:
Na documentação 2.x e documentação 3.x .
fonte
Sim, o que você observou é realmente uma propriedade garantida - chaves (), valores () e itens () retornam listas em ordem congruente, se o ditado não for alterado. iterkeys () & c também iteram na mesma ordem que as listas correspondentes.
fonte
dataframe
oferece uma alternativa em que os itens podem ser atualizados ou excluídos, e a ordem e os locais de índice dos itens em uma estrutura semelhante a um ditado permanecem fixos.Sim, é garantido no python 2.x :
fonte
Sim. A partir do CPython 3.6, os dicionários retornam itens na ordem em que foram inseridos .
Ignore a parte que diz que este é um detalhe de implementação. Esse comportamento é garantido no CPython 3.6 e é necessário para todas as outras implementações do Python que começam com o Python 3.7 .
fonte
Boas referências aos documentos. Veja como você pode garantir o pedido, independentemente da documentação / implementação:
fonte
De acordo com http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects , os métodos keys (), values () e items () de um dict retornarão iteradores correspondentes cujas ordens corresponde. No entanto, não consigo encontrar uma referência à documentação oficial do python 2.x para a mesma coisa.
Até onde eu sei, a resposta é sim, mas apenas no python 3.0+
fonte
Pelo que vale a pena, algum código de produção usado pesado que eu escrevi é baseado nessa suposição e nunca tive problemas com isso. Eu sei que isso não é verdade :-)
Se você não quiser correr o risco, eu usaria iteritems (), se puder.
fonte
Não fiquei satisfeito com essas respostas, pois queria garantir que os valores exportados tivessem a mesma ordem, mesmo ao usar ditados diferentes.
Aqui você especifica a ordem das chaves antecipadamente, os valores retornados sempre terão a mesma ordem, mesmo que o ditado mude, ou use um ditado diferente.
fonte