[Python] Probleme d'algo....

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
(Re)-bonjour
J'ai un problème pour trouver un algo pour mon programme en python.
Je suis sûr que ce n'est pa compliqué du tout mais je tourne en rond et je bloque.
Voilà la situation :
J'ai le dictionnaire suivant:
{'freq': ['5500000000.0'], 'vc': ['0.5', '2.0', '4.0'], 've': ['0.0']}
Je voudrais recréer plusieurs dictionnaire à partir de celui-ci.
Le premier serait : {'freq': ['5500000000.0'], 'vc': ['0.5'], 've': ['0.0']}
Le deuxième : {'freq': ['5500000000.0'], 'vc': ['2.0'], 've': ['0.0']}
Et le troisième : {'freq': ['5500000000.0'], 'vc': ['4.0'], 've': ['0.0']}
Ca n'a pas l'air dur mais j'y arrive pas.....

Merci

12 réponses

sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Si je comprend bien, tu veux créer un dictionnaire pour chaque valeur de vc.

Prenons:
a = {'freq': ['5500000000.0'], 'vc': ['0.5', '2.0', '4.0'], 've': ['0.0']}

Pour récupérer la liste des valeurs de vc, on ferait:
print a['vc']

Pour parcourir cette liste, on pourrait faire:
for valeurVC in a['vc']:
    print valeurVC

ce qui donne:
0.5
2.0
4.0




Maintenant qu'on sait parcourir cette liste, on peut créer un dictionnaire pour chaque valeur de VC:
a = {'freq': ['5500000000.0'], 'vc': ['0.5', '2.0', '4.0'], 've': ['0.0']}
mesdictionnaires = []   # On va stocker nos dictionnaires dans cette liste

for valeurVC in a['vc']:
    nouveauDico = a.copy()                # On copie l'ancien dico
    nouveauDico['vc'] = [valeurVC]        # On change la valeur de la clé "vc"
    mesdictionnaires.append(nouveauDico)

print mesdictionnaires  




Ce qui donne:
[{'freq': ['5500000000.0'], 'vc': ['0.5'], 've': ['0.0']},
{'freq': ['5500000000.0'], 'vc': ['2.0'], 've': ['0.0']},
{'freq': ['5500000000.0'], 'vc': ['4.0'], 've': ['0.0']}]
0
Utilisateur anonyme
 
OK je vois le principe.
J'ai testé ta solution, ça marche.
Je vais essayer d'appliquer ça à mon problème car c'était juste un cas de figure parmi plusieurs possibles.
Merci beaucoup
0
Utilisateur anonyme
 
Me re-voilà....
En me basant sur ce que tu m'as donné, voilà mon code :

for param in self.liste_val_cochee :
for valeur in self.liste_val_cochee[param]:
nouveauDico = self.liste_val_cochee.copy()
nouveauDico[param] = [valeur]
mesdictionnaires.append(nouveauDico)
print nouveauDico

En sachant que self.liste_val_cochee = {'freq': ['5500000000.0'], 'vc': ['0.5', '1.0', '4.0'], 've': ['0.0' ]}

Voilà ce que me renvoie le script :

{'freq': ['5500000000.0'], 'vc': ['0.5', '1.0', '4.0'], 've': ['0.0' ]}
{'freq': ['5500000000.0'], 'vc': ['0.5'], 've': ['0.0']}
{'freq': ['5500000000.0'], 'vc': ['1.0'], 've': ['0.0']}
{'freq': ['5500000000.0'], 'vc': ['4.0'], 've': ['0.0']}
{'freq': ['5500000000.0'], 'vc': ['0.5', '1.0', '4.0'], 've': ['0.0' ]}

Je ne comprends pas pourquoi.
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Est-ce que tu pourrais utiliser les balises <code> du forum dans ton message ?
Parceque je ne vois pas l'indentation du code.
0
Utilisateur anonyme
 
Désolé. J'avais mis des tabulations mais il me les a viré.

for param in self.liste_val_cochee :
for valeur in self.liste_val_cochee[param]:
nouveauDico = self.liste_val_cochee.copy()
nouveauDico[param] = [valeur]
mesdictionnaires.append(nouveauDico)
print nouveauDico
0
Utilisateur anonyme
 
Bon décidément j'y arrive pas.

for param in self.liste_val_cochee :
....for valeur in self.liste_val_cochee[param]:
........nouveauDico = self.liste_val_cochee.copy()
........nouveauDico[param] = [valeur]
........mesdictionnaires.append(nouveauDico)
........print nouveauDico
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Sur le forum CCM, sélectionne ton bout de programme et clic sur le petit bouton "Code".
comme ça il ne perdra par l'indentation.
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Procède par étape.

En faisant déjà ça:
for param in self.liste_val_cochee :
    for valeur in self.liste_val_cochee[param]:
        print valeur


ton constatera qu'il affiche:
5500000000.0
0.5
1.0
4.0
0.0



ça n'est donc déjà pas ce que tu veux faire.
0
Utilisateur anonyme
 
J'ai mis 1/2 h avant de pouvoir me reconnecter sur le forum.
Ca vient de moi?
En ce qui concerne le code, non ce n'est pas ce que je veux faire.
J'ai essayé de faire un algo sur papier mais c'est pas mon fort....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Me basant sur ton message initial, je ne comprend pas pourquoi - là - tu fais 2 boucles imbriquées.
0
Utilisateur anonyme
 
Parce que le dictionnaire 'self.liste_val_cochee' que j'ai donné n'est qu'un exemple.
C'est pour ça que je dois balayer chaque paramètre de mon dictionnaire. (Enfin il me semble)
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
J'ai du mal à bien comprendre ce que tu veux faire.
0
Utilisateur anonyme
 
Alors attention, j'explique.
J'ai un fichier que je dois lire.
Ce sont des valeurs de simulation de transistors.
Je vais prendre l'exemple précis du fichier sur lequel je bosse.
On simule ic et ib en fonction de vb.
Donc jusque-là on doit avoir deux courbes différentes.
Ensuite viennent s'ajouter des paramètres de test :
* la fréquence (constante) = 5.5e+09 Hz
* ve (constant) = 0V
* vc (une liste de valeur) = 0.2 0.5 1 2 4 (V)
Une interface permet à l'utilisateur de choisir les paramètres de test qu'il désire.
Et je dois tracer ic (et/ou ib) en fonction de vb et en fonction des paramètres sélectionnés.
C'est plus clair?
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
C'est un peu plus clair.

Avec self.liste_val_cochee = {'freq': ['5500000000.0'], 'vc': ['0.5', '1.0', '4.0'], 've': ['0.0' ]}

Qu'est-ce que tu voulais obtenir, exactement ?

Ce n'est pas ce que donne le code que j'avais mis ?
0
Utilisateur anonyme
 
Si c'est ça.
Mais tu fixais le paramètre 'vb'.
Et moi je ne peux pas le fixer, car dans un autre fichier, ce paramètre n'existe pas.
C'est pour ça que j'avais rajouté la première boucle pour parcourir tous les paramètres de mon doctionnaire.
0
Utilisateur anonyme
 
Dans un autre cas,
self.liste_val_cochee = {'vb': ['0.75', '0.9'], 'vc': ['1.0', '2.0'], 'vs': ['0.0'], 've': ['0.0']}
Et la ça doit donner 4 dictionnaires différents.
Tu comprends mon problème?
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
ok, donc ça doit donner 1 dictionnaire par valeur de paramètre.

Pour vb:
{'vb': ['0.75'], 'vc': ['1.0', '2.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': [ '0.9'], 'vc': ['1.0', '2.0'], 'vs': ['0.0'], 've': ['0.0']}

puis pour vc:
{'vb': ['0.75', '0.9'], 'vc': ['1.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': ['0.75', '0.9'], 'vc': ['2.0'], 'vs': ['0.0'], 've': ['0.0']}


etc.

C'est bien ça ?
0
Utilisateur anonyme
 
Ben non....
Ca doit donner :
{'vb': ['0.75'], 'vc': ['1.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': ['0.75'], 'vc': ['2.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': [ '0.9'], 'vc': ['1.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': [ '0.9'], 'vc': ['2.0'], 'vs': ['0.0'], 've': ['0.0']}

Dans le premier cas avec freq, y'avait pas de problème puisqu'on avait qu'un seul paramètre qui pouvait changer.
Mais dans ce cas-là (car il s'agit de deux fichiers différents qui n'ont rien à voir ensemble), y'en a deux.
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
ok... donc c'est une combinaison de toutes les valeurs possibles.
Ouf...
0
Utilisateur anonyme
 
Ouais c'est ça.
20 posts pour t'expliquer.
Je ne serai jamais prof....
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Dans quel but génère-tu ce dictionnaire ?

Ce n'est pas pour constuire l'interface graphique ?

Parceque présenter à l'utilisateur une combinaison linéaire de tous les paramètres, ça ne me semble pas la meilleure idée.


Si j'ai bien compris, l'utilisateur peut choisir ou non certains paramètre (case à cocher) et si un paramètre est choisit, il peut choisir sa valeur ?

Ou bien c'est juste oui/non pour chaque paramètre ?
0
Utilisateur anonyme
 
Ce dictionnaire (self.liste_val_cochee) est généré en fonction des paramètres choisis par l'utilisateur.
Dans le cas suivant, j'ai 3 paramètres différents pour la simulation.
Pour chaque paramètre j'affiche toutes les valeurs possibles : (une sorte de menu déroulant avec des checkbuttons pour chaque valeur)
* freq = 5.5e+09
* ve= 0
* vc = 0.2 0.5 1 2 4
L'utilisateur doit choisir au moins une valeur pour chaque paramètre.
Et selon son choix, je peux avoir par exemple :
self.liste_val_cochee = {'freq': ['5500000000.0'], 'vc': ['0.5', '1.0', '4.0'], 've': ['0.0' ]}
ou
self.liste_val_cochee = {'freq': ['5500000000.0'], 'vc': ['0.5'], 've': ['0.0' ]}
ou
self.liste_val_cochee = {'freq': ['5500000000.0'], 'vc': ['1.0', '2.0'], 've': ['0.0' ]}
Tu vois le truc?
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662 > Utilisateur anonyme
 
ok.

Et donc ensuite tu dois lancer un traitement pour chaque combinaison de ces paramètres sélectionnés, c'est ça ?
0
Utilisateur anonyme > sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention  
 
En fonction de son choix, je dois redecomposer ce dictionnaire en plusieurs dictionnaire avec une seule valeur par parmètre pour pouvoir afficher les graphes.
Par exemple si je récupère ça :
self.liste_val_cochee = {'vb': ['0.75', '0.9'], 'vc': ['1.0', '2.0'], 'vs': ['0.0'], 've': ['0.0']}
je dois décomposer en
{'vb': ['0.75'], 'vc': ['1.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': ['0.75'], 'vc': ['2.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': [ '0.9'], 'vc': ['1.0'], 'vs': ['0.0'], 've': ['0.0']}
{'vb': [ '0.9'], 'vc': ['2.0'], 'vs': ['0.0'], 've': ['0.0']}
Ce qui me donne 4 graphes différents.
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662 > Utilisateur anonyme
 
ok, je vois.
0
Utilisateur anonyme > Utilisateur anonyme
 
Je sais que c'est faisable mais je m'embrouille dans les boucles.
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Désolé je n'ai pas le temps de voir ça ce soir.

Je pense que ça peut se résoudre avec une fonction récursive (qui, je l'avoue, n'est pas un concept d'algo forcément facile à assimiler).
0
Utilisateur anonyme
 
OK pas de problème
J'espère qu'on pourra voir ça mardi
Sinon merci pour tout le temps passé.
Si tu viens sur Bordeaux, je te payes une bière, promis....
Bonne soirée
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Voilà la solution.
J'ai choisi finalement une solution non-récursive, mais attention c'est du vite bricolé et ce n'est pas très élégant.
(à ne pas utiliser sur de gros volumes de données)

import pprint

a = {'vb': ['0.75', '0.9'], 'vc': ['1.0', '2.0'], 'vs': ['0.0'], 've': ['0.0']}

print "Dico initial:"
print a

alldicos = [a]
for key in a.keys():
    alldicos2 = []
    items = a[key]
    for item in items:
        for dic in alldicos:
            d = dic.copy()
            d[key] = [item]
            alldicos2.append(d)
    alldicos = alldicos2

print "Resultat:"           
pprint.pprint(alldicos)




Ce qui donne comme résultats:
Dico initial:
{'vb': ['0.75', '0.9'], 'vc': ['1.0', '2.0'], 'vs': ['0.0'], 've': ['0.0']}
Resultat:
[{'vb': ['0.75'], 'vc': ['1.0'], 'vs': ['0.0'], 've': ['0.0']},
 {'vb': ['0.9'], 'vc': ['1.0'], 'vs': ['0.0'], 've': ['0.0']},
 {'vb': ['0.75'], 'vc': ['2.0'], 'vs': ['0.0'], 've': ['0.0']},
 {'vb': ['0.9'], 'vc': ['2.0'], 'vs': ['0.0'], 've': ['0.0']}]
0
Utilisateur anonyme
 
Pour la nième fois, merci.
C'est exactement ce qu'il me fallait.

Mais j'aurais sûrement d'autres questions trés prochainement....
0