[Python] Probleme d'algo....
Résolu/Fermé
A voir également:
- [Python] Probleme d'algo....
- Citizen code python avis - Accueil - Outils
- Trouver la position d'un élément dans une liste python ✓ - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Extraire données fichier texte python ✓ - Forum Python
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 659
5 mai 2006 à 12:26
5 mai 2006 à 12:26
Si je comprend bien, tu veux créer un dictionnaire pour chaque valeur de vc.
Prenons:
Pour récupérer la liste des valeurs de vc, on ferait:
Pour parcourir cette liste, on pourrait faire:
ce qui donne:
Maintenant qu'on sait parcourir cette liste, on peut créer un dictionnaire pour chaque valeur de VC:
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']}]
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']}]
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 15:01
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.
Parceque je ne vois pas l'indentation du code.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 15:17
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.
comme ça il ne perdra par l'indentation.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 15:22
5 mai 2006 à 15:22
Procède par étape.
En faisant déjà ça:
ton constatera qu'il affiche:
ça n'est donc déjà pas ce que tu veux faire.
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.
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 659
5 mai 2006 à 16:10
5 mai 2006 à 16:10
Me basant sur ton message initial, je ne comprend pas pourquoi - là - tu fais 2 boucles imbriquées.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 16:18
5 mai 2006 à 16:18
J'ai du mal à bien comprendre ce que tu veux faire.
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?
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?
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 16:35
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 ?
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 ?
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 16:59
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 ?
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 ?
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.
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.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 17:11
5 mai 2006 à 17:11
ok... donc c'est une combinaison de toutes les valeurs possibles.
Ouf...
Ouf...
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 17:18
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 ?
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 ?
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?
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?
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
>
Utilisateur anonyme
5 mai 2006 à 17:28
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 ?
Et donc ensuite tu dois lancer un traitement pour chaque combinaison de ces paramètres sélectionnés, c'est ça ?
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
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.
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.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
>
Utilisateur anonyme
5 mai 2006 à 17:39
5 mai 2006 à 17:39
ok, je vois.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
5 mai 2006 à 21:18
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).
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).
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
7 mai 2006 à 19:26
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)
Ce qui donne comme résultats:
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']}]
5 mai 2006 à 14:25
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
5 mai 2006 à 14:39
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.