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)
3 Réponses :
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é:
Voici comment je suggérerais de le faire. Pour comprendre cela, vous devrez comprendre:
FuncTools.Reduce Code> a > li>
-
collections.defaultDict code> a > li>
- Récursion LI>
- compréhensions de liste LI>
ol>
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 code> 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 code> est un collections.defaultdict code> 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. p> xxx pré> Vous pouvez voir à la fin je fais un < Code> affirmer code> pour vous assurer que le final_result code> est ce que nous voulons. Faites-moi savoir si vous voulez aider à comprendre tout cela. P> p>
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!
Voici une alternative:
{
"root": {
"A": {
"B": {
"items": "item2",
"C": {
"items": "item1"
}
}
},
"D": {
"items": "item3"
}
}
}
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 code> 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.