Python – Aplanar claves anidadas

A veces, mientras trabajamos con datos de Python, podemos tener un problema en el que necesitamos realizar el aplanamiento de ciertas claves en registros de listas anidadas. Este tipo de problema ocurre durante el preprocesamiento de datos. Analicemos ciertas formas en que se puede realizar esta tarea.

Método n.º 1: Usar bucle
Este es un método de fuerza bruta para realizar esta tarea. En esto, construimos un nuevo diccionario asignando claves base y luego realizamos el aplanamiento de los elementos clave internos usando un bucle anidado.

# Python3 code to demonstrate working of 
# Flatten Nested Keys
# Using loop
  
# initializing list
test_list = [{'Gfg' :  1, 'id' : 1, 'data' : [{'rating' : 7, 'price' : 4},
             {'rating' : 17, 'price' : 8}]}, 
             {'Gfg' :  1, 'id' : 2, 'data' : [{'rating' : 18, 'price' : 19}]}]
  
# printing original list
print("The original list is : " + str(test_list))
  
# Flatten Nested Keys
# Using loop
res = []
for sub in test_list:
    temp1 = {
      'Gfg': sub['Gfg'],
      'id': sub['id']
    }
    for data in sub.get('data', []):
        res.append({
            **temp1,
            'rating': data['rating'],
            'price': data['price']})
  
# printing result 
print("The flattened list : " + str(res)) 
Producción :

La lista original es: [{‘data’: [{‘rating’: 7, ‘price’: 4}, {‘rating’: 17, ‘price’: 8}], ‘id’: 1, ‘Gfg’ : 1}, {‘data’: [{‘rating’: 18, ‘price’: 19}], ‘id’: 2, ‘Gfg’: 1}]
La lista plana: [{‘price’: 4, ‘puntuación’: 7, ‘id’: 1, ‘Gfg’: 1}, {‘price’: 8, ‘rating’: 17, ‘id’: 1, ‘Gfg’: 1}, {‘price’: 19, ‘calificación’: 18, ‘id’: 2, ‘Gfg’: 1}]

Método n.º 2: usar la comprensión de listas + zip() + itemgetter()
La combinación de las funciones anteriores se puede usar para realizar esta tarea. En esto, extraemos los pares requeridos usando itemgetter() y combinamos pares usando zip(). La compilación de datos está utilizando la comprensión de listas.

# Python3 code to demonstrate working of 
# Flatten Nested Keys
# Using list comprehension + zip() + itemgetter()
from operator import itemgetter
  
# initializing list
test_list = [{'Gfg' :  1, 'id' : 1, 'data' : [{'rating' : 7, 'price' : 4},
             {'rating' : 17, 'price' : 8}]}, 
             {'Gfg' :  1, 'id' : 2, 'data' : [{'rating' : 18, 'price' : 19}]}]
  
# printing original list
print("The original list is : " + str(test_list))
  
# initializing base and flatten keys 
base_keys = 'Gfg', 'id'
flatten_keys = 'rating', 'price'
  
# Flatten Nested Keys
# Using list comprehension + zip() + itemgetter()
res = [dict(zip(base_keys + flatten_keys, itemgetter(*base_keys)(sub) + itemgetter(*flatten_keys)(data))) for sub in test_list for data in sub['data']]
  
# printing result 
print("The flattened list : " + str(res)) 
Producción :

La lista original es: [{‘data’: [{‘rating’: 7, ‘price’: 4}, {‘rating’: 17, ‘price’: 8}], ‘id’: 1, ‘Gfg’ : 1}, {‘data’: [{‘rating’: 18, ‘price’: 19}], ‘id’: 2, ‘Gfg’: 1}]
La lista plana: [{‘price’: 4, ‘puntuación’: 7, ‘id’: 1, ‘Gfg’: 1}, {‘price’: 8, ‘rating’: 17, ‘id’: 1, ‘Gfg’: 1}, {‘price’: 19, ‘calificación’: 18, ‘id’: 2, ‘Gfg’: 1}]

Publicación traducida automáticamente

Artículo escrito por manjeet_04 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *