Combiner des dictionnaires

a marqué ce sujet comme résolu.

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 :)

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]

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 ?

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"
        },
    ]

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.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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