2017-08-14 5 views
-1

Ci-dessous des exemples de données de la liste, je veux le convertir en dictionnaire dynamique.Python - créer un dictionnaire imbriqué dynamique à partir de la liste du dictionnaire

result = [ 
    { 
     "standard": "119", 
     "score": "0", 
     "type": "assignment", 
     "student": "4" 
    }, 
    { 
     "standard": "119", 
     "score": "0", 
     "type": "assignment", 
     "student": "5" 
    }, 
    { 
     "standard": "118", 
     "score": "0", 
     "type": "assessment", 
     "student": "4" 
    } 
] 

Je veux créer une fonction conv_to_nested_dict (* args, données), qui convertes toute la liste des clés de dictonary dynamiquement.

Par exemple: conv_to_nested_dict ([ 'standard', 'étudiant'], résultat) devrait donner op:

{ 
    "118": { 
     "4": [{ 
      "score": "0", 
      "type": "assessment" 
     }] 
    }, 
    "119": { 
     "4": [{ 
      "score": "0", 
      "type": "assignment" 
     }], 
     "5": [{ 
      "score": "0", 
      "type": "assignment" 
     }] 
    } 

} 

conv_to_nested_dict ([ 'standard', 'type'], résultat)

{ 
    "118": { 
     "assessment": [{ 
      "score": 0, 
      "student": "4" 
     }] 
    }, 
    "119": { 
     "assignment": [{ 
      "score": 0, 
      "student": "4" 
     },{ 
      "score": 0, 
      "student": "5" 
     }] 
    } 

} 
+0

Est-ce votre devoir? – wroniasty

+0

@wroniasty Je suis bloqué en pensant à la logique, j'ai essayé avec quelques approches comme l'utilisation de group by en Python et de filtres. Je veux le rendre générique et dynamique afin de demander de l'aide. Le problème principal auquel je suis confronté est que les clés sont dynamiques dans le dictionnaire de sortie. – Akash

+0

Il semble y avoir une erreur dans la structure de sortie souhaitée. Vous avez une liste qui n'est pas fermée. S'il vous plaît nettoyer et clarifier la question –

Répondre

1

Ceci est une idée générale.

def conf_to_nested_dict(keys, result): 
    R = {} 
    for record in result: 
     node = R 
     for key in keys[:-1]: 
      kv = record[key] 
      next_node = node.get(kv, {}) 
      node[kv] = next_node 
      node = next_node 
     last_node = node.get(record[keys[-1]], []) 
     last_node.append(record) 
     node[record[keys[-1]]] = last_node 


    return R 

#R is your structure 

result est votre tableau source, keys sont les clés qui vous voulez des résultats du groupe. Itérer sur les résultats, pour chaque enregistrement - créer une arborescence basée sur les valeurs clés (record [clé]). Pour la dernière clé - créez une liste et ajoutez-y l'enregistrement.

+0

Merci beaucoup, Cela a parfaitement fonctionné. Tu as sauvé ma journée, merci. :) – Akash