Combiner des dictionnaires

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut,

J'aimerais combiner plusieurs dictionnaires. Voilà le résultat que j'ai actuellement :

1
2
3
4
5
6
7
8
9
{
    "id": 153, 
    "parameters": [
        {
            "color": 3, 
            "name": "light"
        }
    ]
}

Et mon code actuel :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def get_params(request, active_id):

    tab_parameters = [
        light_parameter(active_id)
    ]

    parameters = {
        'id': active_id,
        'parameters': tab_parameters
    }

    return response.HttpResponse(json.dumps(parameters), 'application/json')


def light_parameter(active_id):
    active_lights = LightParameter.objects.filter(id=active_id).all()

    list_parameters = {}
    for active_light in active_lights:
        list_parameters = {
                'name': 'light',
                'color': active_light.color,
        }

    return list_parameters

Mais j'aimerais arriver à ce résultat.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
    "id": 153, 
    "parameters": [
        {
            "color": 1, 
            "name": "light"
        },
        {
            "color": 2, 
            "name": "light"
        },
        {
            "color": 3, 
            "name": "light"
        }
    ]
}

La solution ne doit pas être compliquée, mais je ne parviens pas à la trouver. Une idée ?

Merci :)

+0 -0

Bonjour,

Je pense que tu devrais revoir l'utilisation des listes et des dictionnaires.

Quand tu fais (lignes 3-4-5) :

1
foo = [bar]

Tu crées une liste contenant un seul élément. Dans ton cas, bar est un dictionnaire, donc ta liste contient un unique dictionnaire. Dans l'idéal, si ta fonction light_parameter fonctionnait correctement (j'y viens juste après), bar serait une liste, et foo deviendrait une liste de liste, ce n'est pas ce que tu veux.

Quand tu fais (lignes 18 à 23) :

1
2
3
dics = {}
for foo in bar:
    dics = {'value': foo}

Tu réassignes foo à chaque tour de boucle, mais tu perds la trace des précédentes assignations. Il te faudrait construire une liste content chacun des dictionnaires :

1
2
3
4
5
dics = []
for foo in bar:
    dics.append({'value': foo})
# Ou en plus concis
dics = [{'value': foo} for foo in bar]
Auteur du sujet

Merci :)

Effectivement, j'avais testé comme cela, j'ai presque le résultat attendu, mais il y a une petite différence :

Résultat attendu :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
    "id": 153, 
    "parameters": [
        {
            "color": 1, 
            "name": "light"
        },
        {
            "color": 2, 
            "name": "light"
        },
        {
            "color": 3, 
            "name": "light"
        }
    ]
}

Résultat actuel :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
    "id": 153, 
    "parameters": [
        [{
            "color": 1, 
            "name": "light"
        },
        {
            "color": 2, 
            "name": "light"
        },
        {
            "color": 3, 
            "name": "light"
        }]
    ]
}

Comment ne mettre mettre ça dans une liste ?

+0 -0
Auteur du sujet

Ah oui, en fait j'utilise une liste ligne 4 car à l'avenir ça va se présenter comme ci-dessous, chaque fonction renvoyant son/ses propre(s) dict :

1
2
3
4
5
6
tab_parameters = [
        light_parameter(active_id),
        other(active_id),
        other_1(active_id),
        ...
    ]

Pour avoir ceci au final :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
"parameters": [
        {
            "color": 1, 
            "name": "light"
        },
        {
            "color": 2, 
            "name": "light"
        },
        {
            "other": 3, 
            "name": "other"
        },
        {
            "other_1": 3, 
            "name": "other_1"
        },
    ]
+0 -0

Cette réponse a aidé l'auteur du sujet

Si chaque fonction renvoie une liste de dictionnaires et non un dictionnaire seul, il te faut simplement concaténer ces différentes listes, pas faire une liste de listes.

1
tab_parameters = light_parameter(active_id) + other(active_id) + other_1(active_id) + ...

Si les fonctions peuvent au choix retourner un dictionnaire ou une liste de dictionnaires, il va te falloir complexifier un poil pour gérer les deux cas.

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte