Python >> Tutorial de Python >  >> Python

Comprensión del diccionario de Python

Hay comprensiones de diccionario en Python 2.7+, pero no funcionan de la forma en que lo estás intentando. Como una lista de comprensión, crean una nueva diccionario; no puede usarlos para agregar claves a un diccionario existente. Además, debe especificar las claves y los valores, aunque, por supuesto, puede especificar un valor ficticio si lo desea.

>>> d = {n: n**2 for n in range(5)}
>>> print d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Si desea establecerlos todos en Verdadero:

>>> d = {n: True for n in range(5)}
>>> print d
{0: True, 1: True, 2: True, 3: True, 4: True}

Lo que parece estar pidiendo es una forma de configurar varias claves a la vez en un diccionario existente. No hay un atajo directo para eso. Puede hacer un bucle como ya mostró, o puede usar una comprensión de diccionario para crear un nuevo dictado con los nuevos valores, y luego hacer oldDict.update(newDict) para fusionar los nuevos valores en el viejo dict.


Puede usar dict.fromkeys método de clase ...

>>> dict.fromkeys(range(5), True)
{0: True, 1: True, 2: True, 3: True, 4: True}

Esta es la forma más rápida de crear un diccionario donde todas las claves se asignan al mismo valor.

Pero no usa esto con objetos mutables:

d = dict.fromkeys(range(5), [])
# {0: [], 1: [], 2: [], 3: [], 4: []}
d[1].append(2)
# {0: [2], 1: [2], 2: [2], 3: [2], 4: [2]} !!!

Si en realidad no necesita para inicializar todas las claves, un defaultdict también podría ser útil:

from collections import defaultdict
d = defaultdict(True)

Para responder a la segunda parte, un dict-comprehension es justo lo que necesita:

{k: k for k in range(10)}

Probablemente no debería hacer esto, pero también podría crear una subclase de dict que funciona como un defaultdict si anula __missing__ :

>>> class KeyDict(dict):
...    def __missing__(self, key):
...       #self[key] = key  # Maybe add this also?
...       return key
... 
>>> d = KeyDict()
>>> d[1]
1
>>> d[2]
2
>>> d[3]
3
>>> print(d)
{}

>>> {i:i for i in range(1, 11)}
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10}