Existem diferenças aplicáveis entre dict.items()
e dict.iteritems()
?
Nos documentos do Python :
dict.items()
: Retorna uma cópia da lista do dicionário de pares (chave, valor).
dict.iteritems()
: Retorna um iterador sobre os pares do dicionário (chave, valor).
Se eu executar o código abaixo, cada um deles retornará uma referência ao mesmo objeto. Faltam algumas diferenças sutis?
#!/usr/bin/python
d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
print 'd.iteritems():'
for k,v in d.iteritems():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
Resultado:
d.items():
they are the same object
they are the same object
they are the same object
d.iteritems():
they are the same object
they are the same object
they are the same object
python
dictionary
python-2.x
o lobo
fonte
fonte
items()
cria os itens de uma só vez e retorna uma lista.iteritems()
retorna um gerador - um gerador é um objeto que "cria" um item de cada vez quenext()
é chamado a ele.d[k] is v
sempre retornaria True porque python mantém uma matriz de objetos inteiros para todos os números inteiros entre -5 e 256: docs.python.org/2/c-api/int.html Quando você cria um int nesse intervalo, na verdade, basta voltar uma referência ao objeto existente:>> a = 2; b = 2 >> a is b True
Mas,>> a = 1234567890; b = 1234567890 >> a is b False
iteritems()
paraiter()
no Python 3? O link da documentação acima parece não corresponder a esta resposta.Respostas:
Faz parte de uma evolução.
Originalmente, o Python
items()
construiu uma lista real de tuplas e a devolveu. Isso pode potencialmente levar muita memória extra.Em seguida, os geradores foram introduzidos na linguagem em geral e esse método foi reimplementado como um método de gerador de iterador chamado
iteritems()
. O original permanece para compatibilidade com versões anteriores.Uma das mudanças do Python 3 é que
items()
agora retornamos iteradores e uma lista nunca é totalmente criada. Oiteritems()
método também se foi, já queitems()
no Python 3 funciona comoviewitems()
no Python 2.7.fonte
iteritems()
. Na verdade, ele cria um objeto de protocolo de sequência completo que também reflete as alterações no dict (e é suportado pelo próprio dict, em vez de uma lista redundante) - foi portado para 2.7 asviewitems()
.iteritems()
sempre é preferível aoitems()
Python 2.x?dict.items()
retorna uma lista de 2-tuplas ([(key, value), (key, value), ...]
), enquanto quedict.iteritems()
é um gerador que gera 2-tuplas. O primeiro ocupa mais espaço e tempo inicialmente, mas o acesso a cada elemento é rápido, enquanto o segundo ocupa menos espaço e tempo, mas um pouco mais na geração de cada elemento.fonte
copy.deepcopy
). Isso significa que é uma cópia dos itens do dicionário: se você fazitems = dct.items()
e modificadct
adicionando / excluindo chaves oudct[k] = other_v
,items
permanecerá o mesmo.{1:'one', 2:'two', ... }
sobre o qual desejo iterar em um servidor da web e renderizar os resultados. Em que escala devo começar a me preocupar em escolher o.items()
vs.iteritems()
para o Python 2.7?No Py2.x
Os comandos
dict.items()
,dict.keys()
edict.values()
retornar uma cópia do de dicionário lista de(k, v)
pares, chaves e valores. Isso pode levar muita memória se a lista copiada for muito grande.Os comandos
dict.iteritems()
,dict.iterkeys()
edict.itervalues()
retornar um iterador sobre o dicionário(k, v)
de pares, chaves e valores.Os comandos
dict.viewitems()
,dict.viewkeys()
edict.viewvalues()
devolver os objetos de exibição , que podem refletir as mudanças do dicionário. (del
Ou seja, se você incluir um item ou adicionar um(k,v)
par no dicionário, o objeto de visualização poderá ser alterado automaticamente ao mesmo tempo.)Enquanto estiver no Py3.x
Em Py3.x, as coisas são mais limpo, uma vez que não são apenas
dict.items()
,dict.keys()
edict.values()
disponível, que retornar a vista objetos , assim comodict.viewitems()
em Py2.x fez.Mas
Assim como o @lvc observou, o objeto view não é o mesmo que o iterador ; portanto, se você deseja retornar um iterador no Py3.x, pode usar
iter(dictview)
:fonte
Você perguntou: 'Existem diferenças aplicáveis entre dict.items () e dict.iteritems ()'
Isso pode ajudar (no Python 2.x):
Você pode ver que
d.items()
retorna uma lista de tuplas da chave, pares de valores ed.iteritems()
retorna um dicionário-itemiterator.Como uma lista, d.items () pode fatiar:
Mas não teria um
__iter__
método:Como iterador, o d.iteritems () não pode ser dividido em fatias:
Mas tem
__iter__
:Portanto, os itens são os mesmos - o contêiner que os entrega é diferente. Uma é uma lista e a outra um iterador (dependendo da versão do Python ...)
Portanto, as diferenças aplicáveis entre dict.items () e dict.iteritems () são as mesmas que as diferenças aplicáveis entre uma lista e um iterador.
fonte
dict.items()
retornar lista de tuplas edict.iteritems()
retornar objeto iterador de tupla no dicionário como(key,value)
. As tuplas são as mesmas, mas o contêiner é diferente.dict.items()
basicamente copia todo o dicionário na lista. Tente usar o código a seguir para comparar os tempos de execução dedict.items()
edict.iteritems()
. Você verá a diferença.Saída na minha máquina:
Isso mostra claramente que
dictionary.iteritems()
é muito mais eficiente.fonte
Se você tem
dict = {key1:value1, key2:value2, key3:value3,...}
No Python 2 ,
dict.items()
copia cada tupla e retorna a lista de tuplas no dicionário, ie[(key1,value1), (key2,value2), ...]
. As implicações são de que todo o dicionário é copiado para uma nova lista contendo tuplasdict.iteritems()
retorna o iterador do item do dicionário. O valor do item retornado também é o mesmo(key1,value1), (key2,value2), ...
, ou seja , mas isso não é uma lista. Este é apenas o objeto do iterador do item do dicionário. Isso significa menos uso de memória (50% menos).d.items() -> list(d.items())
d.iteritems() -> iter(d.items())
As tuplas são as mesmas. Você comparou as tuplas em cada uma delas para obter a mesma.
No Python 3 ,
dict.items()
retorna o objeto iterador. dict.iteritems () é removido para que não haja mais problemas.fonte
dict.iteritems
desapareceu no Python3.x Portanto, useiter(dict.items())
para obter a mesma alocação de saída e memóriafonte
Se você quiser uma maneira de iterar os pares de itens de um dicionário que funcione com o Python 2 e 3, tente algo como isto:
Use-o assim:
fonte
dict.iteritems()
: fornece um iterador. Você pode usar o iterador em outros padrões fora do loop.fonte
dict.iteritems () no python 2 é equivalente a dict.items () no python 3.
fonte