Tengo un diccionario Artículos

Items = {1: 1, 2: 2, 3: 2, 4: 2, 5: 2, 6: 3, 7: 4, 8: 5}

Quiero asignar los valores de los elementos en una lista de diccionarios llamados cargados

loaded = [{6: [4, 1, 3]}, {1: [5]}, {10: [8, 6]}, {6: [7]}, {2: [2]}]

Tal que obtengo esto como mi resultado:

u_loaded = [{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]

Intenté ejecutar bucles y reemplazar los valores si se encuentra una coincidencia pero no funciona

for i in loaded_list:
    for k,v in i.items():
        for j in v:
            for a,b in pid_itemid_dic.items():
                if j==a:
                    j=b
0
Rahul Sharma 10 may. 2019 a las 13:32

4 respuestas

La mejor respuesta
u_loaded = [{k:[Items[a] for a in v] for k,v in l.items()} for l in loaded]
print(u_loaded)

Salida

[{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]
2
Nithin 10 may. 2019 a las 10:39

Puede usar una comprensión simple list:

result = [{k: [Items[v] for v in l] for k, l in d.items()} for d in loaded]
print(result)

Salida:

[{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]

Esto es equivalente al siguiente bucle for:

result = []

for d in loaded:
    new_sub_dict = {}
    for k, l in d.items():
        new_sub_list = []
        for v in l:
            new_sub_list.append(Items[v])
        new_sub_dict[k] = new_sub_list
    result.append(new_sub_dict)
1
gmds 10 may. 2019 a las 10:41

Un paso a la vez, puede abordarlo de la siguiente manera.

loaded = [{6: [4, 1, 3]}, {1: [5]}, {10: [8, 6]}, {6: [7]}, {2: [2]}]

Items = {1: 1, 2: 2, 3: 2, 4: 2, 5: 2, 6: 3, 7: 4, 8: 5}

u_loaded = [{k: [Items[val] for val in v] for k,v in d.items()} for d in loaded]

Para una explicación de 1 liner, podemos abrirlo:

u_loaded = [] #stores the list of dicts
for d in loaded:
    u_d = {} #create empty result dict
    for k,v in d.items():
        u_d[k] = [Items[val] for val in v] #for every value, take the corresponding mapping result from loaded
    u_loaded.append(u_d) #append the dictionary to the result list

Salida:

[{6: [2, 1, 2]}, {1: [2]}, {10: [5, 3]}, {6: [4]}, {2: [2]}]
2
Paritosh Singh 10 may. 2019 a las 10:40

Es posible que desee evitar bucles para adoptar un estilo pitónico. Lo que le gustaría hacer se puede lograr en una sola línea:

u_loaded = [{k: [Items[i] for i in v] for k, v in d.items()} for d in loaded]

Está utilizando la comprensión de la lista para recorrer todos los diccionarios en loaded. Y luego, sigue un ciclo sobre las teclas de los diccionarios k y los valores v para reconstruir el diccionario que desea crear.

0
olivaw 10 may. 2019 a las 10:44