2010-05-17 11 views
138

Estoy haciendo un esfuerzo para aprender Python, y estoy prestando mucha atención a los estándares comunes de codificación. Esto puede parecer una pregunta inútil y quisquillosa, pero estoy tratando de centrarme en las mejores prácticas a medida que aprendo, para no tener que desaprender ningún "mal" hábito.¿Cuál es la sintaxis preferida para inicializar un dict: literales llaves {} o la función dict()?

Veo dos métodos comunes para inicializar un dict:

a = { 
    'a': 'value', 
    'another': 'value', 
} 

b = dict( 
    a='value', 
    another='value', 
) 

¿Qué se considera que es "más Pythonic"? ¿Cuál usas? ¿Por qué?

+4

¿Qué tutorial estás usando? ¿Dónde viste ejemplos que conducen a la confusión? –

+2

Bueno, he estado usando el tutorial de Python, Inmersión en Python y luego una variedad de blogs, publicaciones SO y otros recursos en Google. Los documentos oficiales usan '{}' bastante uniformemente, pero veo mucho del enfoque explícito 'dict()' en otros lugares. Pude ver el beneficio de una sintaxis explícita, pero la ausencia del enfoque en los documentos oficiales me hizo sospechar.Después de publicar esto, miré los documentos de la biblioteca para 'dict' y encontré la precaución de que las claves deben ser identificadores válidos cuando se usa un' dict' explícito para inicializar un dict. – daotoad

+2

¿Cómo es "dict()" más explícito que "{}"? No entiendo tu confusión. Ambos me parecen explícitos. ¿Puedes proporcionar un presupuesto o una referencia que te haga decir que "dict" es "explícito" y que "{}" no es explícito? ¿De dónde crees que surgió esta distinción? –

Respuesta

162

Curly braces. Al pasar argumentos de palabra clave al dict(), aunque funciona perfectamente en muchos escenarios, solo se puede inicializar un mapa si las claves son identificadores de Python válidos.

En otras palabras, no se puede hacer:

a = {'import': 'trade', 1: 7.8} 
65

La primera, llaves. De lo contrario, se encontrará con problemas de coherencia con las claves que tienen caracteres impares en ellas, como =.

# Works fine. 
a = { 
    'a': 'value', 
    'b=c': 'value', 
} 

# Eeep! Breaks if trying to be consistent. 
b = dict( 
    a='value', 
    b=c='value', 
) 
+3

Esto es exactamente por lo que uno podría preferir el método dict() para la inicialización, obliga a las claves del diccionario a ser identificadores válidos, por lo que son compatibles con, por ejemplo, ** kwargs, y las claves son nombres de atributos válidos. – RufusVS

46

La primera versión es preferible:

  • Funciona para todo tipo de llaves, por lo que puede, por ejemplo, decir {1: 'one', 2: 'two'}. La segunda variante solo funciona para (algunas) claves de cadena. Usar diferentes tipos de sintaxis dependiendo del tipo de claves sería una incoherencia innecesaria.
  • es más rápido:

    $ python -m timeit "dict(a='value', another='value')" 
    1000000 loops, best of 3: 0.79 usec per loop 
    $ python -m timeit "{'a': 'value','another': 'value'}" 
    1000000 loops, best of 3: 0.305 usec per loop 
    
  • Si la sintaxis especial para los literales de diccionario no estaba destinado a ser utilizado, probablemente no existiría.
3

Creo que la primera opción es mejor, ya que van a acceder a los valores como [ 'a'] o [ 'otra']. Las claves en su diccionario son cadenas, y no hay ninguna razón para pretender que no lo son. Para mí, la sintaxis de la palabra clave parece inteligente al principio, pero oscura en un segundo vistazo. Esto solo tiene sentido para mí si trabaja con __dict__, y las palabras clave se convertirán en atributos más adelante, algo así.

2

FYI, en caso de que necesite agregar atributos a su diccionario (cosas que se adjuntan al diccionario, pero no son una de las claves), entonces necesitará el segundo formulario. En ese caso, se puede inicializar el diccionario con las teclas tienen caracteres arbitrarios, uno a la vez, así:

class mydict(dict): pass 
    a = mydict()   
    a["b=c"] = 'value' 
    a.test = False 
0

veces dict() es una buena opción:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)])) 

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'], 

[random.randint (0100) para x en el rango (0,7)]))

+2

Hay una función de enumerar que podría hacer esto mejor. Para el caso, hay un tipo Enum que puede hacer mejor lo que estás haciendo aquí. Además, esta no es realmente una respuesta a la pregunta en absoluto. – dusktreader

Cuestiones relacionadas