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']}
3 respuestas
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]}]
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]]}
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]]
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.