posiciones - Diccionario de Python Comprensión
propiedades diccionarios python (8)
¿Es posible crear un diccionario de comprensión en Python (para las teclas)?
Sin listas 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 for
.
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
.
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" e "i for i in range (1, 11)" no es una clave válida, solo es un error de sintaxis. Si los dicts soportan 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.
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}
No puedes hacer una lista como esta. prueba esto en su lugar, usa tuplas
d[tuple([i for i in range(1,11)])] = True
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)
{}
Utilice 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))])
Python 2.7+ incluye versiones de diccionarios , pero no funcionan de la manera 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 combinar los nuevos valores en el dict antiguo.
>>> {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}