[Python] Probleme d'algo....

Résolu/Fermé
Utilisateur anonyme - 5 mai 2006 à 12:09
 Utilisateur anonyme - 9 mai 2006 à 09:37
(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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 12:26
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
5 mai 2006 à 14:25
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
5 mai 2006 à 14:39
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 15:01
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
5 mai 2006 à 15:09
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
5 mai 2006 à 15:10
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 15:17
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 15:22
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
5 mai 2006 à 16:04
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 16:10
Me basant sur ton message initial, je ne comprend pas pourquoi - là - tu fais 2 boucles imbriquées.
0
Utilisateur anonyme
5 mai 2006 à 16:13
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 16:18
J'ai du mal à bien comprendre ce que tu veux faire.
0
Utilisateur anonyme
5 mai 2006 à 16:27
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 16:35
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
5 mai 2006 à 16:41
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
5 mai 2006 à 16:43
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 16:59
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
5 mai 2006 à 17:07
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 17:11
ok... donc c'est une combinaison de toutes les valeurs possibles.
Ouf...
0
Utilisateur anonyme
5 mai 2006 à 17:12
Ouais c'est ça.
20 posts pour t'expliquer.
Je ne serai jamais prof....
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 17:18
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
5 mai 2006 à 17:28
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655 > Utilisateur anonyme
5 mai 2006 à 17:28
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019
5 mai 2006 à 17:32
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655 > Utilisateur anonyme
5 mai 2006 à 17:39
ok, je vois.
0
Utilisateur anonyme > Utilisateur anonyme
5 mai 2006 à 17:43
Je sais que c'est faisable mais je m'embrouille dans les boucles.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2006 à 21:18
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
5 mai 2006 à 22:55
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 mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
7 mai 2006 à 19:26
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
9 mai 2006 à 09:37
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