¿Cómo puedo agregar nuevas marcas de tiempo como json anidado en value_map si las otras claves en la lista son las mismas? A continuación se muestra la lista de ejemplos de dictados.

dicts = [{
    "key": "v3_CA125_2019-09-19",
    "sn": "M9257",
    "value_map": {
      "06:59:59": {
        "V_615": "1",
        "V_616": "2",
      }
    }
  },
  {
    "key": "v3_CA125_2019-09-19",
    "sn": "M9257",
    "value_map": {
      "10:59:59": {
        "V_613": "30",
        "V_614": "22"
      }
    }
  },
  {
    "key": "v3_CA125_2019-09-23",
    "sn": "M9257",
    "value_map": {
      "12:59:59": {
        "V_615": "33"
      }
    }
  },
  {
    "key": "v3_CA125_2019-09-23",
    "sn": "M9257",
    "value_map": {
      "09:59:59": {
        "V_602": "0.208984375"
      }
    }
  }
]

Intento tener una salida como:

dicts = [{
    "key": "v3_CA125_2019-09-19",
    "sn": "M9257",
    "value_map": {
      "06:59:59": {
        "V_615": "1",
        "V_616": "2",
      },
      "10:59:59": {
        "V_613": "30",
        "V_614": "22"
      }
    }
  },
  {
    "key": "v3_CA125_2019-09-23",
    "sn": "M9257",
    "value_map": {
      "12:59:59": {
        "V_615": "33"
      },
      "09:59:59": {
        "V_602": "0.208984375"
      }
    }
  }
]

Traté de agregar value_map con OrderedDict pero no pude alcanzar algo hasta ahora. ¿Alguna sugerencia?

from collections import OrderedDict
d = OrderedDict()
for l in dicts :
    d.setdefault((l['partition_key'], l['sort_key'], l['sn']), set()).add(l['value_map'])

result = [{'partition_key': k[0], 'sort_key': k[1], 'sn':k[2], 'value_map': v.pop() if len(v) == 1 else v} for k, v in d.items()] 
1
ylcnky 5 oct. 2019 a las 23:36

4 respuestas

La mejor respuesta
key_to_index_map ={} # to know when we saw the object with a given key
desired_list = []
for elem in dicts:
  key = elem['key']
  # append if you see another object with same key
  if key in key_to_index_map:
    value_map = desired_list[key_to_index_map[key]]["value_map"]
    value_map.update(elem['value_map']);
    desired_list[key_to_index_map[key]]['value_map'] = value_map;
  else: # or simply add to the final list
    desired_list.append(elem);
    key_to_index_map[key] = len(desired_list)-1;
1
Ajay 5 oct. 2019 a las 21:16

La "fusión de JSON" o la combinación de valores de dos objetos dict en Python se pueden hacer con el desempaquetado utilizando el operador **.

En las siguientes líneas puede encontrar un ejemplo simple en el que puede observar el comportamiento y utilizarlo según sea necesario en su problema.

d1 = {"a": 1, "b": 2}                                                                                                   

d2 = {"b": 3, "c": 4}                                                                                                   

d3 = {**d1, **d2}                                                                                                       

d3 # Output                                                                                                                      
{'a': 1, 'b': 3, 'c': 4}

d4 = {**d2, **d1}                                                                                                       

d4 # Output                                                                                                                     
{'b': 2, 'c': 4, 'a': 1}
0
MikeMajara 5 oct. 2019 a las 21:15

Tiene el value_map como una lista mientras necesita un diccionario.

1
rela 13 dic. 2019 a las 19:04

Su atributo value_map debe ser una matriz [] en lugar de un dict {}

0
Cedric Druck 5 oct. 2019 a las 20:41
58252137