Diccionario de Python Comprensión

¿Es posible crear un diccionario de comprensión en Python (para las teclas)?

Sin una lista de comprensión, puedes usar algo como esto:

l = [] for n in range(1, 11): l.append(n) 

Podemos acortar esto a una lista de comprensión: l = [n for n in range(1, 11)] .

Sin embargo, digamos que quiero configurar las claves de un diccionario al mismo valor. Puedo hacer:

 d = {} for n in range(1, 11): d[n] = True # same value for each 

He intentado esto:

 d = {} d[i for i in range(1, 11)] = True 

Sin embargo, me sale un SyntaxError en el.

Además (no necesito esta parte, solo me pregunto), ¿puedes configurar las claves de un diccionario a varios valores diferentes, como este:

 d = {} for n in range(1, 11): d[n] = n 

¿Es esto posible con un diccionario de comprensión?

 d = {} d[i for i in range(1, 11)] = [x for x in range(1, 11)] 

Esto también genera un SyntaxError en el for .

Python 2.7+ incluye versiones de diccionarios , pero no funcionan de la forma que estás intentando. Como una lista de comprensión, crean un nuevo diccionario; no se pueden usar 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 True:

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

Lo que parece que está 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 el que ya mostró, o podría usar un diccionario de comprensión para crear un nuevo dictado con los nuevos valores, y luego hacer oldDict.update(newDict) para fusionar los nuevos valores en el dict antiguo.

Puedes usar el método de clase dict.fromkeys

 >>> 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 teclas se asignan al mismo valor.

Pero no uses 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 inicializar todas las claves, un punto por defaultdict puede ser útil:

 from collections import defaultdict d = defaultdict(True) 

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

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

Probablemente no deberías hacer esto, pero también podrías crear una subclase de dict que funcione de manera similar a un valor defaultdict si anulas __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} 

Me gusta mucho el comentario de @mgilson, ya que si tiene dos iterables, uno que corresponde a las teclas y el otro a los valores, también puede hacer lo siguiente.

 keys = ['a', 'b', 'c'] values = [1, 2, 3] d = dict(zip(keys, values)) 

dando

d = {‘a’: 1, ‘b’: 2, ‘c’: 3}

Use dict () en una lista de tuplas, esta solución le permitirá tener valores arbitrarios en cada lista, siempre que tengan la misma longitud

 i_s = range(1, 11) x_s = range(1, 11) # x_s = range(11, 1, -1) # Also works d = dict([(i_s[index], x_s[index], ) for index in range(len(i_s))]) 

Considere este ejemplo de contar la ocurrencia de palabras en una lista usando la comprensión del diccionario

 my_list = ['hello', 'hi', 'hello', 'today', 'morning', 'again', 'hello'] my_dict = {k:my_list.count(k) for k in my_list} print(my_dict) 

Y el resultado es

 {'again': 1, 'hi': 1, 'hello': 3, 'today': 1, 'morning': 1} 

El propósito principal de una lista de comprensión es crear una nueva lista basada en otra sin cambiar o destruir la lista original.

En lugar de escribir

  l = [] for n in range(1, 11): l.append(n) 

o

  l = [n for n in range(1, 11)] 

deberías escribir solo

  l = range(1, 11) 

En los dos bloques de código principales, está creando una nueva lista, iterando a través de ella y devolviendo cada elemento. Es solo una forma costosa de crear una copia de la lista.

Para obtener un nuevo diccionario con todas las claves configuradas en el mismo valor basado en otro dictado, haga lo siguiente:

  old_dict = {'a': 1, 'c': 3, 'b': 2} new_dict = { key:'your value here' for key in old_dict.keys()} 

Estás recibiendo un SyntaxError porque cuando escribes

  d = {} d[i for i in range(1, 11)] = True 

básicamente está diciendo: “Establezca mi clave ‘i for i in range (1, 11)’ en True” y “i for i in range (1, 11)” no es una clave válida, solo es un error de syntax. Si los dicts soportaran listas como claves, harías algo como

  d[[i for i in range(1, 11)]] = True 

y no

  d[i for i in range(1, 11)] = True 

pero las listas no son hashables, por lo que no puede usarlas como teclas dict.

No puedes hacer una lista como esta. prueba esto en su lugar, usa tuplas

 d[tuple([i for i in range(1,11)])] = True