0
votes

Objets de groupe JSON pour fabriquer la structure des arbres

J'ai une liste d'objets JSON comme celui-ci -

{text: "root": items: 
    [{text: "A", items: [ 
         {text: "B", items: [
              {text: "C", items: [
                  text: "item1", items:[]]}, 
              {text: "item2", items: []}}]}, 
     {text: "D", items: [{text: "item3", items: []}]}
    ]
]}

# pseudocode 
result = dict()
result["text"] = "root"
result["items"] = [] 

d = {"Level1": set(), "Level2": set(), "Level3": set(), "Level4": set()}

for row in data_rows: 
    insertLocation = result["items"] 
    for key in ["Level1", "Level2", "Level3", "Level4"]: 
        txt = row[key]
        if txt in d[key]: 
            for j in insertLocation: 
                if j.text = txt: 
                     insertLocation = j
                     break  
        else: 
            newItem = {"text": txt, "items": []}
            insertLocation = newItem.items
            d[key].add(txt)
        


5 commentaires

Votre programme fait-il ce que vous voulez faire?


Il n'est pas clair pour moi si vous avez un problème avec le code ou que vous voulez juste un retour d'information.


Cela fonctionne - je n'aime tout simplement pas la façon dont il a l'air et me demandant s'il y a des moyens plus intelligents de le faire. Comme des voies plus concises


Il y a définitivement une manière plus élégante et j'imagine que cela implique des objets non imbriqués d'objets. Voyez ici: Stackoverflow.com/questions/19189274/... Puisque vous ne vous souciez que des valeurs, vous pouvez simplifier immédiatement le problème en modifiant votre contribution pour être uniquement les valeurs DICT. Vous vous souciez que de l'ordre des valeurs non nulles.


Je vote pour fermer cette question car il appartient à évaluation de code . Les questions d'optimisation ont tendance à être basées sur des opinions et en dehors de la portée de si.


3 Réponses :


0
votes

Je vous suggère de vérifier cette réponse par @anom sur "Qu'est-ce que certains sont bons Méthodes d'optimisation du code? ". En résumé: xxx


0 commentaires

0
votes

Voici comment je suggérerais de le faire. Pour comprendre cela, vous devrez comprendre:

  1. FuncTools.Reduce
  2. collections.defaultDict
  3. Récursion
  4. compréhensions de liste

    Fondamentalement, je modifie d'abord l'entrée (car les touches ne comptent pas), pour être une liste de listes de valeurs non nulelles. Ensuite, je functools.Reduce Les listes de valeurs non nulles dans une structure d'arborescence simple qui est de la forme que nous voulons. Tout dans ce simple_tree est un collections.defaultdict donc je les convertis enfin en dict normaux et utilise la récursivité pour obtenir la structure "Text" / "éléments" que vous souhaitez. < / p>

    Cette approche est plus "fonctionnelle" que votre approche et est plus intelligente sur la taille de l'entrée. xxx

    Vous pouvez voir à la fin je fais un < Code> affirmer pour vous assurer que le final_result est ce que nous voulons. Faites-moi savoir si vous voulez aider à comprendre tout cela.


2 commentaires

Je suis heureux que tu aimes ça! Les 4 choses que j'ai mentionnées au début sont tout ce que vous devez savoir. Je peux vous expliquer l'un d'entre eux dans une langue simple si vous le souhaitez. Je dois m'allonger maintenant. Toute cette récursion m'a donné vertige ...


En fait, je suis familière avec la programmation fonctionnelle, donc cela fait un sens parfait - merci encore!



0
votes

Voici une alternative:

{
    "root": {
        "A": {
            "B": {
                "items": "item2",
                "C": {
                    "items": "item1"
                }
            }
        },
        "D": {
            "items": "item3"
        }
    }
}


0 commentaires