Tengo un diccionario cargado:

{'17.0x6.0x7.0 6.0': ['4.60x4.30x4.30 4.00, 4.60x4.30x4.30 1.00, 4.60x4.30x4.30 3.00'],
 '9.5x5.5x5.5 1.0': ['4.60x4.30x4.30 5.00'],
 '22.0x7.5x8.0 10.0': ['6.60x6.00x5.16 8.00, 9.00x6.00x5.60 6.00'],
 '17.0x6.0x7.0 6.0_1': ['8.75x6.60x5.60 7.00'],
 '9.5x5.5x5.5 2.0': ['4.60x4.30x4.30 2.00']}

Quiero extraer los valores flotantes después de las dimensiones.

Salida deseada:

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

Intenté esto para extraer las dimensiones

loaded_items = {int(float(k.split()[1])): [int(float(j.split()[1])) for i in v for j in i.split(",")] for k,v in loaded.items()}

Pero esto me da salida como tal:

{6: [7], 1: [5], 10: [8, 6], 2: [2]}

Es decir, cuando encuentra el segundo objeto similar, reemplaza el valor.

Probé un método más:

all_items_loaded = {}
for k,v in loaded.items():
    a = k.split()[1]
    print(a)
    for i in v:
        x = i.split()
        x = x[1::2]
        all_items_loaded[a] = x

Y la salida es:

{'6.0': ['4.00,', '1.00,', '3.00'],
 '1.0': ['5.00'],
 '10.0': ['8.00,', '6.00'],
 '6.0_1': ['7.00'],
 '2.0': ['2.00']}
0
Rahul Sharma 10 may. 2019 a las 10:56

3 respuestas

La mejor respuesta

Hay problemas con sus datos y la salida requerida.

La entrada dict contiene una clave '17 .0x6.0x7.0 6.0_1 '. Si bien llamar a int (float ()) en '6.0_1' funciona (se convierte a 6.01 y posteriormente a 6) no recomendaría esto y más bien investigaría la razón por la cual estos datos se proporcionan de esta manera.

El dict de salida deseado contiene claves duplicadas. Esto no es posible y causa la sobre escritura que está describiendo. Cambie su estructura de datos de salida de dict a p. Ej. lista de dictados.

[{int(float(key.split()[1])): [int(float(val.split()[1])) for val in value[0].split(",")]} for (key,value) in a.items() ]
--> [{6: [4, 1, 3]}, {1: [5]}, {10: [8, 6]}, {6: [7]}, {2: [2]}]
2
fluxens 10 may. 2019 a las 08:34

La única sugerencia que puedo hacer (además de obtener una mejor entrada) es crear tuplas. Cree una función simple para extraer valores de cadenas:

>>> def extract(v): return int(float(v.split()[1]))

Y aplique esta función a los pares clave-valor del diccionario y produzca una lista de pares:

>>> loaded_items = {
...     '17.0x6.0x7.0 6.0': ['4.60x4.30x4.30 4.00, 4.60x4.30x4.30 1.00, 4.60x4.30x4.30 3.00'],
...     '9.5x5.5x5.5 1.0': ['4.60x4.30x4.30 5.00'],
...     '22.0x7.5x8.0 10.0': ['6.60x6.00x5.16 8.00, 9.00x6.00x5.60 6.00'],
...     '17.0x6.0x7.0 6.0_1': ['8.75x6.60x5.60 7.00'],
...     '9.5x5.5x5.5 2.0': ['4.60x4.30x4.30 2.00']
... }
>>> data = [(extract(k), [extract(v) for v in vs[0].split(",")])  for k, vs in loaded_items.items()]
>>> data
[(6, [4, 1, 3]), (1, [5]), (10, [8, 6]), (6, [7]), (2, [2])]

Luego puede agrupar los valores si es necesario:

>>> d1 = {}
>>> for k,v in data: d1.setdefault(k, []).extend(v)
>>> d1
{6: [4, 1, 3, 7], 1: [5], 10: [8, 6], 2: [2]}

O:

>>> d2 = {}
>>> for k,v in data: d2.setdefault(k, []).append(v)
>>> d2
{6: [[4, 1, 3], [7]], 1: [[5]], 10: [[8, 6]], 2: [[2]]}
0
jferard 10 may. 2019 a las 17:32

Debe decidir una forma diferente de asociar los datos o elegir una estructura de datos diferente para usar. Un ejemplo, un defaultdict, está debajo. Esta es no la única solución y obtener una mejor entrada sería la primera prioridad.

from collections import defaultdict

d = defaultdict(list)
d['6.0'].append([7])
d['6.0'].append([4,1,3])

print(d['6.0'])

# result [[7], [4, 1, 3]]
0
Andrew Allen 10 may. 2019 a las 08:13