Usando PyCharm, noté que ofrece convertir un dict literal :
d = {
'one': '1',
'two': '2',
}
en un constructor dict :
d = dict(one='1', two='2')
¿Estos diferentes enfoques difieren de alguna manera significativa?
(Mientras escribía esta pregunta, noté que usarlo dict()
parece imposible especificar una clave numérica ... d = {1: 'one', 2: 'two'}
es posible, pero, obviamente, dict(1='one' ...)
no lo es. ¿Algo más?)
python
dictionary
pycharm
maligno
fuente
fuente
dict()
toma una lista de pares clave-valor, además de permitir parámetros con nombre, por lo que puede usarse para crear cualquier tipo de dict, solo que no con la sintaxis que está usando. Probablemente tampoco valga nada que haya un error ( youtrack.jetbrains.net/issue/PY-2512 ) en pyCharm específicamente debido a lo que descubrió, que se ha solucionado).dict(abc = 123)
constructor produce un diccionario con claves de cadena de bytes'abc'
, lo que puede ser sorprendente si está utilizandounicode_literals
y espera que las claves de diccionario sean unicodeu'abc'
. Ver stackoverflow.com/questions/20357210/… .Respuestas:
Creo que has señalado la diferencia más obvia. Aparte de eso,
el primero no necesita buscar, lo
dict
que debería hacerlo un poco más rápidoel segundo mira hacia arriba
dict
enlocals()
y despuésglobals()
y los hallazgos de la orden interna, lo que puede cambiar el comportamiento mediante la definición de un local llamadodict
, por ejemplo, aunque no puedo pensar en ningún lugar esto sería una idea buena, aparte de que tal vez cuando la depuraciónfuente
Literal es mucho más rápido, ya que utiliza códigos de operación BUILD_MAP y STORE_MAP optimizados en lugar de CALL_FUNCTION genérico:
fuente
Se ven más o menos iguales en Python 3.2.
Como señaló gnibbler, el primero no necesita buscar
dict
, lo que debería hacerlo un poco más rápido.fuente
$ 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
Estos dos enfoques producen diccionarios idénticos, excepto, como se ha señalado, donde las reglas léxicas de Python interfieren.
Los literales de diccionario son un poco más obviamente diccionarios, y puede crear cualquier tipo de clave, pero necesita citar los nombres de las claves. Por otro lado, puede usar variables para claves si lo necesita por alguna razón:
El
dict()
constructor le brinda más flexibilidad debido a la variedad de formas de entrada que toma. Por ejemplo, puede proporcionarle un iterador de pares, y los tratará como pares clave / valor.No tengo idea de por qué PyCharm ofrecería convertir una forma a la otra.
fuente
Una gran diferencia con python 3.4 + pycharm es que el constructor dict () produce un mensaje de "error de sintaxis" si el número de claves excede 256.
Prefiero usar el literal dict ahora.
fuente
Del tutorial de Python 2.7:
Mientras:
Entonces, tanto {} como dict () producen diccionario pero proporcionan formas un poco diferentes de inicialización de datos de diccionario.
fuente
Creo que el literal dict
d = {'one': '1'}
es mucho más legible, sus datos definitorios, en lugar de asignar valores a las cosas y enviarlas aldict()
constructor.Por otro lado, he visto a personas escribir mal el literal dict, ya
d = {'one', '1'}
que en Python 2.7+ moderno creará un conjunto.A pesar de esto, todavía prefiero usar el literal literal en todos los sentidos porque creo que es una preferencia personal más legible, supongo.
fuente
set
s existe. Desearía que hubiera una sintaxis literal para los dictados ordenados ... estoy bastante seguro de que los uso con más frecuencia que los conjuntos.el literal dict () es bueno cuando copia valores de pegado de otra cosa (ninguna python) Por ejemplo, una lista de variables de entorno. si tenía un archivo bash, diga
puede pegar fácilmente en un
dict()
literal y agregar comentarios. También hace que sea más fácil hacer lo contrario, copiar en otra cosa. Mientras que la{'FOO': 'bar'}
sintaxis es bastante exclusiva de python y json. Entonces, si usa mucho json, es posible que desee usar{}
literales con comillas dobles.fuente
No hay un literal dict para crear clases heredadas dict, clases dict personalizadas con métodos adicionales. En tal caso, se debe utilizar el constructor de clase dict personalizado, por ejemplo:
fuente
También considere el hecho de que los tokens que coinciden con los operadores no se pueden usar en la sintaxis del constructor, es decir, las teclas con guiones.
fuente