As visualizações de dicionário são essencialmente o que seu nome diz: as visualizações são simplesmente como uma janela nas chaves e valores (ou itens) de um dicionário. Aqui está um trecho da documentação oficial do Python 3:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> keys # No eggs anymore!
dict_keys(['sausage', 'bacon', 'spam'])
>>> values # No eggs value (2) anymore!
dict_values([1, 1, 500])
(O equivalente do Python 2 usa dishes.viewkeys()
e dishes.viewvalues()
.)
Este exemplo mostra o caráter dinâmico das visualizações : a visualização de chaves não é uma cópia das chaves em um determinado momento, mas uma janela simples que mostra as chaves; se eles forem alterados, o que você vê através da janela também muda. Esse recurso pode ser útil em algumas circunstâncias (por exemplo, é possível trabalhar com uma exibição nas chaves em várias partes de um programa em vez de recalcular a lista atual de chaves sempre que necessário) - observe que, se as chaves do dicionário forem modificadas ao iterar sobre a exibição, o comportamento do iterador não está bem definido, o que pode levar a erros .
Uma vantagem é que olhar para, digamos, as chaves usa apenas um pequeno e fixo quantidade de memória e requer um pequeno e fixo quantidade de tempo do processador , já que não há criação de uma lista de chaves (Python 2, por outro lado, geralmente cria desnecessariamente uma nova lista, conforme citado por Rajendran T, que leva memória e tempo em uma quantidade proporcional ao comprimento da lista). Para continuar a analogia da janela, se você quiser ver uma paisagem atrás de uma parede, basta fazer uma abertura nela (você constrói uma janela); copiar as chaves em uma lista corresponderia a pintar uma cópia da paisagem na parede - a cópia ocupa tempo, espaço e não se atualiza.
Para resumir, as visualizações são simplesmente ... visualizações (janelas) no seu dicionário, que mostram o conteúdo do dicionário mesmo depois que ele é alterado. Eles oferecem recursos diferentes dos das listas: uma lista de chaves contém uma cópia das chaves do dicionário em um determinado momento, enquanto uma exibição é dinâmica e é muito mais rápida de obter, pois não precisa copiar nenhum dado ( chaves ou valores) para serem criados.
Como você mencionou,
dict.items()
retorna uma cópia da lista de pares (chave, valor) do dicionário, que é um desperdício edict.iteritems()
retorna um iterador sobre os pares (chave, valor) do dicionário.Agora, pegue o exemplo a seguir para ver a diferença entre um interator de dict e uma visão de dict
Considerando que uma visão simplesmente mostra o que está no ditado. Não importa se mudou:
Uma visualização é simplesmente a aparência do dicionário agora. Após a exclusão, uma entrada
.items()
estaria desatualizada e.iteritems()
geraria um erro.fonte
viewitems()
é realmente correto (items()
fornece uma visão correta no Python 3 ).Só de ler os documentos, recebo esta impressão:
Então, acho que o principal caso de uso é se você está mantendo um dicionário por perto e repetidamente repetindo suas chaves / itens / valores com modificações no meio. Você poderia apenas usar uma visualização, transformando
for k, v in mydict.iteritems():
-afor k, v in myview:
. Mas se você estiver apenas repetindo o dicionário uma vez, acho que as versões iterativas ainda são preferíveis.fonte
iteritems()
). Então, qual é o objetivo dessas visões? Quando fico feliz em tê-los?.values()
, mas isso envolve fazer uma cópia inteira como uma lista, o que pode ser caro. Há,.itervalues()
mas você não pode consumi-las mais de uma vez, para que não funcione com todas as funções. As visualizações não exigem uma cópia cara, mas ainda são mais úteis como valor independente do que um iterador. Mas eles ainda não têm a intenção de ajudar na iteração e modificação ao mesmo tempo (lá você realmente deseja uma cópia).Os métodos de vista retornar uma lista (não uma cópia da lista, em comparação com
.keys()
,.items()
e.values()
), por isso é mais leve, mas reflete o conteúdo atual do dicionário.No Python 3.0 - métodos dict retornam visualizações - por que?
fonte
As visualizações permitem acessar a estrutura de dados subjacente, sem copiá-la. Além de dinâmico, em vez de criar uma lista, um dos usos mais úteis é o
in
teste. Digamos que você queira verificar se um valor está no ditado ou não (seja chave ou valor).A primeira opção é criar uma lista de chaves usando
dict.keys()
, isso funciona, mas obviamente consome mais memória. Se o ditado é muito grande? Isso seria um desperdício.Com
views
você pode iterar a estrutura de dados real, sem lista intermediária.Vamos usar exemplos. Eu tenho um ditado com 1000 teclas de seqüências e dígitos aleatórios e
k
é a chave que eu quero procurarComo você pode ver, o
view
objeto de iteração dá um enorme impulso ao desempenho, reduzindo a sobrecarga de memória ao mesmo tempo. Você deve usá-los quando precisar executarSet
operações semelhantes.Nota : Estou executando no Python 2.7
fonte
.keys()
retorna uma visualização por padrão. Pode querer checar duas vezes thok
uma das chaves do dicionáriolarge_d
deve ser feitok in large_d
no Python, que é provavelmente tão rápido quanto o uso de uma exibição (em outras palavras,k in large_d.keys()
não é Pythonic e deve ser evitado - como esták in large_d.viewkeys()
).k in large_d
é realmente significativamente mais rápido quek in large_d.viewkeys()
, portanto, isso provavelmente deve ser evitado, mas isso faz sentidok in large_d.viewvalues()
.