Usando PyCharm, notei que ele oferece a conversão de um dict literal :
d = {
'one': '1',
'two': '2',
}
em um construtor de ditado :
d = dict(one='1', two='2')
Essas abordagens diferentes diferem de alguma maneira significativa?
(Ao escrever esta pergunta, notei que o uso dict()
parece impossível especificar uma chave numérica .. d = {1: 'one', 2: 'two'}
é possível, mas, obviamente, dict(1='one' ...)
não é. Mais alguma coisa?)
python
dictionary
pycharm
discordar
fonte
fonte
dict()
leva uma lista de pares de valores-chave e permite parâmetros nomeados, para que possa ser usado para criar qualquer tipo de regra, mas não com a sintaxe que você está usando. Provavelmente também não vale nada que tenha ocorrido um erro ( youtrack.jetbrains.net/issue/PY-2512 ) no pyCharm especificamente por causa do que você descobriu, que foi corrigido).dict(abc = 123)
construtor produz um dicionário com chaves de cadeia de bytes'abc'
, o que pode ser surpreendente se você estiver usandounicode_literals
e esperando que as chaves de dicionário sejam unicodeu'abc'
. Consulte stackoverflow.com/questions/20357210/… .Respostas:
Eu acho que você apontou a diferença mais óbvia. Além disso,
o primeiro não precisa procurar, o
dict
que deve torná-lo um pouco mais rápidoa segunda olha para cima
dict
emlocals()
e, em seguida,globals()
e os achados da embutidas, para que possa mudar o comportamento definindo um local chamadodict
, por exemplo, embora eu não consigo pensar em qualquer lugar esta seria uma boa ideia para além de, talvez, quando a depuraçãofonte
O literal é muito mais rápido, pois usa os opcodes BUILD_MAP e STORE_MAP otimizados, em vez dos genéricos CALL_FUNCTION:
fonte
Eles têm a mesma aparência no Python 3.2.
Como apontou o gnibbler, o primeiro não precisa pesquisar
dict
, o que deve torná-lo um pouco mais rápido.fonte
$ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' "{'a': 1, 'b': 2, 'c': 3}" ....... Mean +- std dev: 1.73 ns +- 0.14 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' '{k:v for k,v in i}' ....... Mean +- std dev: 139 ns +- 10 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' 'dict(i)' ....... Mean +- std dev: 188 ns +- 16 ns
Essas duas abordagens produzem dicionários idênticos, exceto, como você observou, onde as regras lexicais do Python interferem.
Os literais de dicionário são um pouco mais obviamente dicionários, e você pode criar qualquer tipo de chave, mas precisa citar os nomes das chaves. Por outro lado, você pode usar variáveis para chaves se precisar, por algum motivo:
o
dict()
construtor oferece mais flexibilidade devido à variedade de formas de entrada necessárias. Por exemplo, você pode fornecer a ele um iterador de pares e ele os tratará como pares de chave / valor.Não faço ideia por que o PyCharm se ofereceria para converter um formulário no outro.
fonte
Uma grande diferença com o python 3.4 + pycharm é que o construtor dict () produz uma mensagem de "erro de sintaxe" se o número de chaves exceder 256.
Eu prefiro usar o literal dict agora.
fonte
Do tutorial do python 2.7:
Enquanto:
Portanto, {} e dict () produzem dicionário, mas fornecem maneiras um pouco diferentes de inicialização dos dados do dicionário.
fonte
Acho o literal do ditado
d = {'one': '1'}
muito mais legível, seus dados definidores, em vez de atribuir valores às coisas e enviá-los aodict()
construtor.Por outro lado, tenho visto pessoas digitarem o dict literal como
d = {'one', '1'}
que no python moderno 2.7+ criará um conjunto.Apesar disso, eu ainda prefiro usar o conjunto literal de todas as maneiras, porque acho que é a sua preferência pessoal mais legível, suponho.
fonte
set
s existe. Eu gostaria que houvesse uma sintaxe literal para ditados ordenados ... com certeza os uso com mais frequência do que conjuntos.o literal dict () é bom quando você está copiando e colando valores de outra coisa (nenhum python). Por exemplo, uma lista de variáveis de ambiente. se você tivesse um arquivo bash, diga
você pode colar facilmente em um
dict()
literal e adicionar comentários. Também facilita fazer o oposto, copiar para outra coisa. Enquanto a{'FOO': 'bar'}
sintaxe é bastante exclusiva para python e json. Portanto, se você usa muito o json, convém usar{}
literais com aspas duplas.fonte
Não há literal de dict para criar classes herdadas por dict, classes de dict personalizadas com métodos adicionais. Nesse caso, o construtor de classe dict personalizado deve ser usado, por exemplo:
fonte
Considere também o fato de que os tokens correspondentes aos operadores não podem ser usados na sintaxe do construtor, ou seja, chaves comherização.
fonte