Tengo la horrible sensación de que esto será un duplicado, hice todo lo posible para encontrar la respuesta.

Tengo un diccionario y una lista, y quiero crear una lista de diccionarios, usando la lista para sobrescribir uno de los valores clave, como este:

d={"a":1,"b":10}      
c=[3,4,5] 
arg=[]
for i in c:
    e=d.copy()
    e["a"]=i
    arg.append(e)

Esto da el resultado deseado

arg
[{'a': 3, 'b': 10}, {'a': 4, 'b': 10}, {'a': 5, 'b': 10}]

Pero el código es feo, especialmente con el comando de copia, y en lugar de una lista tengo 4 o 5 en mi ejemplo real, lo que conduce a un gran bucle anidado. Estoy seguro de que hay una forma más ordenada con un iterador como

arg=[d *with* d[a]=i for i in c] 

Donde no estoy segura de qué poner en el lugar de la "con". Donde no estoy seguro de qué poner en el lugar del "con".

Nuevamente, disculpas si esto ya está respondido.

1
Adrian Tompkins 9 dic. 2020 a las 12:57

4 respuestas

La mejor respuesta

IIUC, podría hacer:

d={"a":1,"b":10}
c=[3,4,5]

res = [{ **d, "a" : ci } for ci in c]
print(res)

Salida

[{'a': 3, 'b': 10}, {'a': 4, 'b': 10}, {'a': 5, 'b': 10}]

La parte:

"a" : ci

Reescribe el valor en la clave "a" y **d desempaqueta el diccionario.

2
Dani Mesejo 9 dic. 2020 a las 10:00

Lo haría de esta manera:

arg=[d.copy() for i in range(len(c))]
for i in range(len(arg)):
    arg[i]['a']=c[i]

Este código primero crea una lista de diccionarios con la longitud de cy luego actualiza 'a' para cada diccionario, con el ítem respectivo de c

2
IoaTzimas 9 dic. 2020 a las 10:12

En Python 3.9 hay un nuevo método para crear un diccionario nuevo con valores actualizados y mantener el diccionario antiguo sin actualizaciones, usando el operador |

new_dict = old_dict | dict_with_updates

Con la comprensión de la lista será

arg = [ d | {"a": i} for i in c]

Ejemplo completo

d = {"a": 1, "b": 10}
c = [3, 4, 5]

arg = [ d | {"a": i} for i in c]

print(arg)

Por cierto: también hay |= para actualizar el diccionario existente

old_dict |= dict_with_updates

Documento: Novedades de Python 3.9

1
furas 9 dic. 2020 a las 11:44

Puede hacerlo usando una comprensión de diccionario dentro de una comprensión de lista, verificando la clave == 'a':

d = {"a":1,"b":10}
c = [3,4,5]
l = [{k: num if k == 'a' else v for k,v in d.items()} for num in c]
1
jignatius 9 dic. 2020 a las 10:24
65214482