Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/11/2012, 14h56   #1
roro34570
Invité de passage
 
Homme
Inscription : octobre 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : octobre 2012
Messages : 7
Points : 1
Points : 1
Par défaut Créer liste à partir d'une string

Bonjour à tous,

est il possible de créer des listes dont le nom a été généré automatiquement, comme à l'aide de ce code.

Le résultat donne donc une liste de string. Ce que je veux faire, c'est créer autant de liste qu'il y a d'item dans la liste et que leur nom soit celui des strings de la liste "liste_depart"

Est ce possible ?

Merci
Fichiers attachés
Type de fichier : py pour_forum.py (134 octets, 9 affichages)
roro34570 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 15h11   #2
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 941
Points : 1 412
Points : 1 412
Salut,

Pour un petit code il est mieux de l'insérer directement dans ton message.

Avec les balises qui vont bien.
Code :
1
2
3
4
5
6
7
8
9
 
liste_depart = []
 
compteur = 1
 
for i in range(1,15):
    liste_depart.append("liste"+str(i))
 
print(liste_depart)
Ce code semble déjà répondre à ce que tu demande, non ?

("liste"+str(i)) étant une string générée par le code et commence par le terme donné.

Peut-être qu'un exemple de listes d'entrée et de sortie sera plus clair.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 15h17   #3
roro34570
Invité de passage
 
Homme
Inscription : octobre 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : octobre 2012
Messages : 7
Points : 1
Points : 1
Salut, merci pour ta réponse.

Je pense que je viens de trouver dans le FAQ. Et oui je me suis précipité dsl.

Donc à partir de la liste que génère le code, je veux créer des listes à part entière qui auront comme nom les strings de la liste générée.

http://python.developpez.com/faq/ind...es#GenStrDecla
roro34570 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 15h55   #4
roro34570
Invité de passage
 
Homme
Inscription : octobre 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : octobre 2012
Messages : 7
Points : 1
Points : 1
Citation:
INPUT :

liste = ["liste1","liste2","liste3","liste4"]




OUTPUT :

liste1=[]
liste2=[]
liste3=[]
liste4=[]
Donc sur le FAQ je n'ai pas trouvé la réponse. On peut changer la string en variable. Pour changer en liste je n'ai pas trouvé.
roro34570 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 16h35   #5
pfeuh
Membre Expert
 
Développeur en systèmes embarqués
Inscription : mars 2006
Messages : 763
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 763
Points : 1 031
Points : 1 031
Salut,

Je pense que tu n'as eu le déclic, mais la réponse est bel et bien dans le lien que tu donnes. Par contre la fonction exec est une grosse faille de sécurité car en tant qu'utilisateur on peut modifier le script qui est en train de s'exécuter.

Code :
1
2
3
4
5
6
items = ["liste1","liste2","liste3","liste4"]
for item in items:
    commandline = "%s = []"%item
    print 'execution de la ligne "%s"'%commandline
    exec(commandline)
print liste1, liste2, liste3, liste4
De plus l'intérêt de cette façon de faire n'est pas terrible, car à chaque fois que tu voudras utiliser une de ces listes, il faudra passer par la commande exec ou eval...

Code :
1
2
3
4
5
6
7
8
items = ["liste1","liste2","liste3","liste4"]
for item in items:
    exec("%s = []"%item)
 
templist = eval('liste4')
for value in ["azerty", 33, 123.4566]:
    templist.append(value)
print eval('liste4')
A+

Pfeuh
pfeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 16h38   #6
memento80
Nouveau Membre du Club
 
Avatar de memento80
 
Homme
Mon boulot ?? En ce moment, j'me l'demande...
Inscription : novembre 2004
Messages : 77
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Mon boulot ?? En ce moment, j'me l'demande...
Secteur : Industrie

Informations forums :
Inscription : novembre 2004
Messages : 77
Points : 31
Points : 31
Bonjour,

Ou alors je ne suis pas sur d'avoir compris la question mais la réponse ne réside-t-elle pas dans la fonction exec tel que c'est expliqué dans la FAQ ?

Code :
1
2
3
4
5
6
7
8
9
 
Une autre méthode est d'utiliser directement la fonction exec(unstr) qui exécute la chaîne de caractères passé en argument
 
>>> exec('mavariable=5')
>>> mavariable
5
>>> exec("mavariable=['5','6']")
>>> mavariable
['5', '6']
Ceci afin d'exécuter dans chaque boucle une exécution de création de la liste avec le nom souhaité.

Edit : J'ai été moins rapide..
memento80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 17h18   #7
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 709
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 709
Points : 4 546
Points : 4 546
Salut,

Pour créer une liste vide nommée "foo", il suffit de créer l'entrée directement dans globals().
Code :
1
2
3
4
5
6
>>> items = ["liste1","liste2","liste3","liste4"]
>>> for z in items:
...     globals()[z] = []
...
>>> print (liste1, liste2, liste3, liste4)
[] [] [] []
eval et exec étant "troubles", autant apprendre à s'en passer.
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 18h22   #8
pfeuh
Membre Expert
 
Développeur en systèmes embarqués
Inscription : mars 2006
Messages : 763
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 763
Points : 1 031
Points : 1 031
Citation:
Envoyé par wiztricks Voir le message
Pour créer une liste vide nommée "foo", il suffit de créer l'entrée directement dans globals().
Là, je dis "respect!" Tous les jours j'apprends, c'est ça que j'aime sur ce forum!

A+

Pfeuh
pfeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2012, 13h32   #9
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 322
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 322
Points : 1 820
Points : 1 820
@roro34570

Niveau concept, on peut savoir quel est l'intérêt de faire ce genre de choses, car là je vois pas.

Peux-tu nous donner la problématique, car ce genre de solutions est très rarement utilisée?

La résultant étant n listes vides, il est nettement plus judicieux de faire

Code :
1
2
3
4
liste_depart = [ [] for i in range(n)]
 
for liste in liste_depart:
    # traitement de chacune des listes dans liste_depart
Générer des noms de variables est quasiment inutile, il y a les boucles pour cela.

Donc si on pouvait connaître ton problème, on pourrait plus facilement te donner des solutions adaptées...
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2012, 16h43   #10
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 709
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 709
Points : 4 546
Points : 4 546
Citation:
Envoyé par fred1599 Voir le message
Niveau concept, on peut savoir quel est l'intérêt de faire ce genre de choses, car là je vois pas.

Peux-tu nous donner la problématique, car ce genre de solutions est très rarement utilisée?
Classer des objets dans des listes en faisant que le nom de la catégorie soit associé à la liste des objets correspondant est un b.a.ba de la conception.
Avec une liste de listes, on n'a plus que des index.

Ca fonctionne mais si les lignes sont des "catégories", il faudra avoir un mapping nom => index "à côté" pour se rappeler à quoi cela correspond.

Le seul défaut est peut être de vouloir ranger cela dans globals() plutôt que dans un dict "particulier".

- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2012, 17h01   #11
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 322
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 322
Points : 1 820
Points : 1 820
Citation:
Le seul défaut est peut être de vouloir ranger cela dans globals() plutôt que dans un dict "particulier".

Eh bien oui, au cas où tu ne veux pas les index, le dictionnaire est plutôt sympa.

Code :
1
2
3
4
5
6
7
8
9
>>> liste_depart = {}
>>> for i in range(4):
...     liste_depart["liste{}".format(i+1)] = []
... 
>>> liste_depart
{'liste1': [], 'liste3': [], 'liste2': [], 'liste4': []}
>>> liste_depart['liste1'].append(15)
>>> liste_depart
{'liste1': [15], 'liste3': [], 'liste2': [], 'liste4': []}
Visait-il la notion de catégorie? Je suis pas sûr, d'où ma question sur sa problématique.
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2012, 19h38   #12
roro34570
Invité de passage
 
Homme
Inscription : octobre 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : octobre 2012
Messages : 7
Points : 1
Points : 1
Mon but est en fait d'apprendre l'utilisation des classes. Donc je me suis donné un exercice : Des tirages aléatoires de nombres, comme au loto. Préalablement, on demande à l'utilisateur combien de série de tirage il désire et combien de numéro tiré pour chaque série.
En tout cas merci pour toutes ces réponses. L'utilisation de globals() me satisfait beaucoup
roro34570 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2012, 20h23   #13
Darkemal
Membre du Club
 
Homme
Lycéen
Inscription : novembre 2012
Messages : 35
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : novembre 2012
Messages : 35
Points : 51
Points : 51
Bonsoir,

Tu devrais éviter d'utiliser globals(), on sait jamais en cas de fausse manœuvre tu peux supprimer toutes les références que contient le dictionnaire et ça serait assez désastreux pour le bon déroulement de ton programme.
Surtout que pour apprendre à utiliser les classes, il y a plus simple ! Je sais pas, un mini jeu vidéo en console ça permet d'approcher toutes les facettes de la POO tout en restant relativement ludique !

Bonne chance
Darkemal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2012, 21h28   #14
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 709
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 709
Points : 4 546
Points : 4 546
Citation:
Envoyé par Darkemal Voir le message
Tu devrais éviter d'utiliser globals(), on sait jamais en cas de fausse manœuvre tu peux supprimer toutes les références que contient le dictionnaire et ça serait assez désastreux pour le bon déroulement de ton programme.
globals() n'est qu'un dictionnaire.
Il est particulier puisque c'est là que sont rangées les variables "globales" mais ce ne sont que celles du module courant. Et un module dans son utilisation est proche d'une classe (on ne peut en hériter).

Citation:
Mon but est en fait d'apprendre l'utilisation des classes. Donc je me suis donné un exercice : Des tirages aléatoires de nombres, comme au loto. Préalablement, on demande à l'utilisateur combien de série de tirage il désire et combien de numéro tiré pour chaque série.
En tout cas merci pour toutes ces réponses. L'utilisation de globals() me satisfait beaucoup
Les classes sont d'abord des fabriques d'objets qui pourront avoir des attributs et des méthodes semblables.

Fabriquer cette suite de tirages aléatoires se réduit à l'appel d'une fonction tirage(n) qui retournera une liste de n nombres aléatoires.
C'est bien car il faut bien commencer par les fonctions.
Mais bien trop simple pour apprendre à utiliser les classes.

Au cas où le tutoriel est quand même le chemin le plus indiqué pour débuter en faisant le tour de Python.
Vous faites comme vous voulez mais sans vision d'ensemble, vous risquez de perdre beaucoup de temps sur certains sujets. Non qu'ils sont difficiles, juste parce que vous n'avez pas encore les bases, les repères,... qui vous permettront de relativiser l'essentiel et l'important.
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2012, 11h51   #15
Sve@r
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 496
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 45
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 496
Points : 6 610
Points : 6 610
Citation:
Envoyé par roro34570 Voir le message
Mon but est en fait d'apprendre l'utilisation des classes. Donc je me suis donné un exercice : Des tirages aléatoires de nombres, comme au loto. Préalablement, on demande à l'utilisateur combien de série de tirage il désire et combien de numéro tiré pour chaque série.
Salut
Comme le dit fred1599, plutôt que de faire un truc de ce style
tirage1=...
tirage2=...
tirage3=...
et créer une usine à gaz pour remplacer cette énumération par un élément créateur de nom de variable, autant passer par un tableau justement fait pour ça !!!
Code python :
1
2
3
tirage=[]
for i in xrange(nb_tirage):
    tirage.append(fonction_qui_renvoie_une_liste_de_no())

Ou, encore plus simplement
Code python :
tirage=[fonction_qui_renvoie_une_liste_de_no() for i in xrange(nb_tirage)]

Et ensuite, te suffit de demander tirage[x] quand tu veux accéder au tirage n° x...

Citation:
Envoyé par roro34570 Voir le message
En tout cas merci pour toutes ces réponses. L'utilisation de globals() me satisfait beaucoup
Mouais. En effet pourquoi faire simple quand...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2012, 15h50   #16
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 709
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 709
Points : 4 546
Points : 4 546
Si le sujet est de faire des "class" plutôt qu'enfouir l'intention dans des index pourquoi ne pas écrire:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import random
from pprint import pprint
 
class Tirages(list):
 
     def add(self, count):
          self.append([ random.randint(0,100) for _ in range(count) ])
 
     def show(self):
          for x, e in enumerate(self, 1):
               print ('Tirage.%d: ' % x, end='')
               pprint(e)
 
     def __getitem__(self, x):
         return super().__getitem__(x - 1)
Tirages collecte l'ensemble des tirages dans une liste.
  • On peut ajouter un tirage à "count" positions.
  • Récupérer le tirage n
  • afficher tous les tirages

Code :
1
2
3
4
5
6
if __name__ == '__main__':
    tirages = Tirages()
    tirages.add(3)
    tirages.add(2)
    tirages.show()
    pprint(tirages[1])
La sortie sera:
Code :
1
2
3
Tirage.1: [6, 27, 87]
Tirage.2: [48, 52]
[6, 27, 87]
Ce code contient pas mal de Pythonneries qu'un débutant mettra du temps à acquérir. Apprendre à transformer idées/concepts en "objets" construits à partir de briques de bases, c'est le voyage de l'apprenti en POO.
(et oui on peut faire plus court et plus rapide, mais quelle importance?)
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2012, 09h39   #17
kervarker
Candidat au titre de Membre du Club
 
Pierre Quentel
Inscription : novembre 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Pierre Quentel

Informations forums :
Inscription : novembre 2009
Messages : 10
Points : 11
Points : 11
Bonjour,

Juste un commentaire sur la génération d'un tirage : avec
Code :
[ random.randint(0,100) for _ in range(count) ]
on n'est pas à l'abri de tirer 2 fois le même nombre. Il vaut mieux utiliser une autre fonction du module random :
Code :
random.sample(range(1,50),6)
renvoie 6 nombres tirés au hasard parmi les entiers de 1 à 49 inclus
kervarker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2012, 11h18   #18
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 709
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 709
Points : 4 546
Points : 4 546
Bonne remarque.
Patchons (ou more class features)

Code :
1
2
3
4
5
6
7
V1 = Tirages(list):
 
class Tirages(V1):
     _samples = range(1,50)
 
     def add(self, count):
          self.append(random.sample(self._samples, count))
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 16h13   #19
roro34570
Invité de passage
 
Homme
Inscription : octobre 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : octobre 2012
Messages : 7
Points : 1
Points : 1
Ok, merci à tous pour ces réponses. J'étais déjà sur le tutoriel de Gérard Swinnen, mais je voulais sortir un peu des sentiers battus En plus j'ai zappé les bibliothèques. Je vais y retourner en faisant les choses dans l'ordre.
roro34570 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h25.


 
 
 
 
Partenaires

Hébergement Web