Gostaria de saber o que é melhor fazer:
d = {'a': 1, 'b': 2}
'a' in d
True
ou:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
python
dictionary
igorgue
fonte
fonte
keys()
é apenas uma visualização de conjunto em um dicionário, em vez de uma cópia, assimx in d.keys()
como O (1). Ainda assim,x in d
é mais pitônico.x in d.keys()
deve construir e destruir um objeto temporário, completo com a alocação de memória que implica, ondex in d.keys()
está apenas fazendo uma operação aritmética (calculando o hash) e fazendo uma pesquisa. Observe qued.keys()
é apenas cerca de 10 vezes maior que isso, o que ainda não é muito longo. Eu não verifiquei, mas ainda tenho certeza de que é apenas O (1).in
ganha de mãos para baixo, não apenas em elegância (e não sendo depreciada ;-) mas também em desempenho, por exemplo:Embora a seguinte observação nem sempre seja verdadeira, você notará que , geralmente , em Python, a solução mais rápida é mais elegante e pitônica; é por isso que
-mtimeit
é tão útil - não se trata apenas de economizar cem nanossegundos aqui e ali! -)fonte
has_key
parece ser O (1) também.De acordo com a documentação do python :
fonte
has_key()
foi removido no Python 3Use
dict.has_key()
se (e somente se) for necessário que seu código seja executável pelas versões do Python anteriores à 2.3 (quandokey in dict
foi introduzido).fonte
Há um exemplo em que
in
realmente mata seu desempenho.Se você usar
in
em um O (1) recipiente que apenas implementos__getitem__
ehas_key()
, mas não__contains__
você vai virar um O (1) procurar em uma pesquisa O (N) (comoin
cai de volta para uma busca linear via__getitem__
).A correção é obviamente trivial:
fonte
has_key()
é específico para dicionários Python 2 .in
/__contains__
é a API correta a ser usada; para aqueles recipientes onde uma varredura completa é inevitável não há nenhumhas_key()
método de qualquer maneira , e se há um O (1) abordagem, em seguida, que vai ser de caso de uso específico e assim até o desenvolvedor para escolher o tipo de dados correto para o problema.has_key
é um método de dicionário, masin
funcionará em qualquer coleção e, mesmo quando__contains__
estiver ausente,in
usará qualquer outro método para iterar a coleção e descobrir.fonte
in
testes emrange
objetos. Não tenho tanta certeza sobre sua eficiência no Python 2xrange
. ;)__contains__
pode calcular trivialmente se um valor está no intervalo ou não.range
instância a cada vez. Usando uma instância única e preexistente, o teste "número inteiro no intervalo" é cerca de 40% mais rápido nos meus tempos.A solução para dict.has_key () está obsoleta, use 'in' - sublime text editor 3
Aqui eu peguei um exemplo de dicionário chamado 'idades' -
fonte
Expandindo os testes de desempenho de Alex Martelli com os comentários de Adam Parkin ...
fonte
Se você tem algo parecido com isto:
altere para abaixo para rodar no Python 3.X e acima:
fonte
t.has_key(ew)
retornaTrue
se asew
referências de valor também são uma chave no dicionário.key not in t
retornaTrue
se o valor for nãono dicionário. Além disso, okey = ew
alias é muito, muito redundante. A ortografia correta éif ew in t
. Qual é o que a resposta aceita de 8 anos antes já lhe disse.