7
votes

Façon générique de créer un dictionnaire imbriqué de la liste plate à Python

Je cherche le plus simple Generic Générique pour convertir cette liste Python: xxx

dans: xxx < p> La combinaison "FOO", "BAR", "BAZ" est unique et, comme vous pouvez le constater, la liste n'est pas nécessairement commandée par cette clé.


1 commentaires

Quel est votre moyen (pas nécessairement la plus simple, mais la vôtre) de le faire?


3 Réponses :


0
votes

Je définirais une fonction qui effectue une seule étape de regroupement comme celle-ci: xxx

puis faire xxx

ce qui donne la résultat pour foos .


0 commentaires

3
votes
[{'bars': [{'bar': 'R', 'bazs': [{'baz': 'X'}, {'baz': 'Y'}]},
           {'bar': 'S', 'bazs': [{'baz': 'Y'}]}],
  'foo': 'A'},
 {'bars': [{'bar': 'S', 'bazs': [{'baz': 'X'}]}], 'foo': 'B'},
 {'bars': [{'bar': 'R', 'bazs': [{'baz': 'Y'}]}], 'foo': 'C'}]

0 commentaires

0
votes

Ceci est une boucle simple sur les données, pas de récursivité. Un arbre auxiliaire où les valeurs sont des clés de dictionnaires sert d'index dans l'arborescence de résultat alors qu'il est construit.

def make_tree(diclist, keylist):
    indexroot = {}
    root = {}
    for d in diclist:
        walk = indexroot
        parent = root
        for k in keylist:
            walk = walk.setdefault(d[k], {})
            node = walk.setdefault('node', {})
            if not node:
                node[k] = d[k]
                parent.setdefault(k+'s',[]).append(node)
            walk = walk.setdefault('children', {})
            parent = node
    return root[keylist[0]+'s']

foos = make_tree(x, ["foo","bar","baz"])


0 commentaires