¿Es posible crear una comprensión de diccionario en Python (para las claves)?
Sin listas de comprensión, puede usar algo como esto:
l = []
for n in range(1, 11):
l.append(n)
Podemos acortar este a una lista por comprensión: l = [n for n in range(1, 11)]
.
Sin embargo, supongamos que quiero establecer las claves de un diccionario con el 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, pero me pregunto), ¿puede establecer las claves de un diccionario en un montón de valores diferentes, como este:
d = {}
for n in range(1, 11):
d[n] = n
¿Es esto posible con una comprensión de diccionario?
d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]
Esto también plantea un SyntaxError
en el for
.
python
dictionary
list-comprehension
Rushy Panchal
fuente
fuente
Respuestas:
Hay comprensiones de diccionario en Python 2.7+ , pero no funcionan del modo en que lo está intentando. Como una lista de comprensión, crean un nuevo 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.
Si desea establecerlos todos en True:
Lo que parece estar pidiendo es una forma de configurar varias teclas 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 del diccionario para crear un nuevo dict con los nuevos valores y luego
oldDict.update(newDict)
fusionar los nuevos valores en el antiguo dict.fuente
dict.update
también puede aceptar un iterable de pares clave-valor al igual que eldict
constructordict.fromkeys()
. Entonces, para establecer todos los valoresTrue
, usedict.fromkeys(range(5), True)
. Cuidado, el valor no se copia , por lo que es posible que desee evitar esto cuando tenga un valor mutable; se compartirá entre todas las claves.{ n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}
. Tanto se puede hacer en la misma expresión:{ n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
.Puedes usar el
dict.fromkeys
método de clase ...Esta es la forma más rápida de crear un diccionario donde todas las claves se asignan al mismo valor.
Pero no , no usar esto con objetos mutables :
Si realmente no necesita inicializar todas las claves, a
defaultdict
podría ser útil también:Para responder a la segunda parte, una comprensión dict es justo lo que necesita:
Probablemente no debería hacer esto, pero también podría crear una subclase
dict
que funcione de manera similar a unadefaultdict
anulación__missing__
:fuente
d = defaultdict(lambda: True)
, la lambda no es necesaria ya que True es (o no debería) ser mutable.fuente
Me gusta mucho el comentario de @mgilson, ya que si tiene dos iterables, uno que corresponde a las claves y el otro a los valores, también puede hacer lo siguiente.
dando
fuente
{i:j for i in keys for j in values}
Use dict () en una lista de tuplas, esta solución le permitirá tener valores arbitrarios en cada lista, siempre que tengan la misma longitud
fuente
d = dict(zip(i_s,x_s))
Considere este ejemplo de contar la aparición de palabras en una lista usando la comprensión del diccionario
Y el resultado es
fuente
El objetivo principal de la comprensión de una lista es crear una nueva lista basada en otra sin cambiar o destruir la lista original.
En lugar de escribir
o
deberías escribir solo
En los dos bloques de código superiores, está creando una nueva lista, iterando a través de ella y simplemente 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 dict, haga esto:
Estás recibiendo un SyntaxError porque cuando escribes
básicamente estás diciendo: "Establecer mi clave 'i para i en rango (1, 11)' en Verdadero" e "i para i en rango (1, 11)" no es una clave válida, es solo un error de sintaxis. Si dicta las listas compatibles como claves, haría algo como
y no
pero las listas no se pueden compartir, por lo que no puede usarlas como claves dict.
fuente
no puedes hacer una lista como esa. intente esto en su lugar, usa tuplas
fuente