OVH Cloud OVH Cloud

variable dynamiquement indexée

19 réponses
Avatar
remi
Bonjour,

J'ai une liste du type ['item 1', 'item 2',....'item n'].
J'aimerai stocker la chaine "item 1" dans la variable s1, "item 2" dans
la variable s2..."item n" dans sn
J'utilise une boucle while, mais le problème est au niveau de nom de la
variable qui doit être "dynamique"...
Une idée ?
Merci.
Rémi.

10 réponses

1 2
Avatar
Do Re Mi chel La Si Do
Bonjour !

L'utilisation d'un dictionnaire devrait convenir : .

item1='A111'
item2='B222'
item3='C333'
dic={}
dic['s1']=item1
dic['s2']=item2
dic['s3']=item3

v='s2'
print 'Deuxième item :",dic[v]

@-salutations

Michel Claveau
Avatar
Amaury Forgeot d'Arc
Bonjour,

J'ai une liste du type ['item 1', 'item 2',....'item n'].
J'aimerai stocker la chaine "item 1" dans la variable s1, "item 2" dans
la variable s2..."item n" dans sn
J'utilise une boucle while, mais le problème est au niveau de nom de la
variable qui doit être "dynamique"...
Une idée ?
Merci.
Rémi.


locals() renvoie le dictionnaire des variables locales.
Donc quelque chose comme ceci :

liste=['item 1', 'item 2', 'item n']
for item in liste:
name = 's' + item[5:]
value = 'value '+item[5:]
locals()[name] = value

On peut aussi utiliser "exec", mais personnellement j'aime moins...

Amaury

Avatar
remi
Bonjour !

L'utilisation d'un dictionnaire devrait convenir : .

item1='A111'
item2='B222'
item3='C333'
dic={}
dic['s1']=item1
dic['s2']=item2
dic['s3']=item3

v='s2'
print 'Deuxième item :",dic[v]


Merci. L'idée est aussi de ne pas avoir à numéroter à la main les s_i.
J'ai essayé ça à partir de l'idée de dictionnaire :

dict = {}
for item in contents_list:
#contents_list est la liste faite à partir d'un fichier
dict["s_%d" % len(dict)] = item

Maintenant, il faudrait que j'automatise un peu le code suivant :
s_0 = dict['s_0']
s_1 = dict['s_1']
s_2 = dict['s_2']
s_3 = dict['s_3']
s_4 = ...

Je vais tenter avec des %d... Si vous avez des conseils, je suis tjs
preneur. Merci.
Rémi (newbie)

Avatar
F. Petitjean
Bonjour,

J'ai une liste du type ['item 1', 'item 2',....'item n'].
J'aimerai stocker la chaine "item 1" dans la variable s1, "item 2" dans
la variable s2..."item n" dans sn
super dur :

s1 = "item 1" # ou lst[0]
s2 = "item 2" # ou lst[1]
J'utilise une boucle while, mais le problème est au niveau de nom de la
variable qui doit être "dynamique"...
Qu'appelez-vous une variable dynamique ?

Une idée ?
for item in lst:

print item # utiliser la "variable"
Merci.
Rémi.
Le problème est que python n'a pas vraiment la notion de variable

item est une référence, une étiquette sur chacun des éléments
successsifs de la liste lst.
Que voulez-vous faire dans votre boucle ?

Avatar
Nicolas
s_0 = dict['s_0']
s_1 = dict['s_1']
s_2 = dict['s_2']
s_3 = dict['s_3']
s_4 = ...
je vois pas l'intérêt de la chose... pourquoi ne pas utiliser

directement le dictionnaire, c'est bien plus propre ??

enfin, si tu y tiens vraiment, tu peux faire ça avec des exec() :
for i in dict: exec(i+"=dict[i]")

mais c'est à mon humble avis de newbie bien moins efficace...

Avatar
remi
Bonjour,


J'ai une liste du type ['item 1', 'item 2',....'item n'].
J'aimerai stocker la chaine "item 1" dans la variable s1, "item 2" dans
la variable s2..."item n" dans sn


super dur :
s1 = "item 1" # ou lst[0]
s2 = "item 2" # ou lst[1]


oui mais s'il y a 100 items... L'idée est justement d'affecter la chaîne
correspondand au "i-ième item" dans la i_ième variable et ce de
manière automatique.

Par exemple faire une s_i = lst[i] avec i variant entre 0 et
len(list)... d'où la boucle while.

C'est pour ça que je parle, maladroitement, de nom de variables dynamique.

Merci !
Rémi.


Avatar
remi

s_0 = dict['s_0']
s_1 = dict['s_1']
s_2 = dict['s_2']
s_3 = dict['s_3']
s_4 = ...


je vois pas l'intérêt de la chose... pourquoi ne pas utiliser
directement le dictionnaire, c'est bien plus propre ??


Euh, comment ? J'ai pas assez RTFM ?
Merci.
Rémi.


enfin, si tu y tiens vraiment, tu peux faire ça avec des exec() :
for i in dict: exec(i+"=dict[i]")


Ca fonctionne ! Merci.
Pour info, voici le code :

dict = {}
for item in contents_list:
dict["s_%d" % len(dict)] = item
for i in dict: exec(i+"=dict[i]") # permet de créer les n variables s_i

Pas très élegant ?
Rémi.




mais c'est à mon humble avis de newbie bien moins efficace...



Avatar
F. Petitjean
Bonjour,


J'ai une liste du type ['item 1', 'item 2',....'item n'].
J'aimerai stocker la chaine "item 1" dans la variable s1, "item 2" dans
la variable s2..."item n" dans sn


super dur :
s1 = "item 1" # ou lst[0]
s2 = "item 2" # ou lst[1]


oui mais s'il y a 100 items... L'idée est justement d'affecter la chaîne
correspondand au "i-ième item" dans la i_ième variable et ce de
manière automatique.
Et pourquoi tenez vous tant à avoir 100 variables ?

lst[0], ... lst[99] cela ne peuy vraiment pas convenir ?

Par exemple faire une s_i = lst[i] avec i variant entre 0 et
len(list)... d'où la boucle while.

C'est pour ça que je parle, maladroitement, de nom de variables dynamique.
Et surtout que vous évitez soigneusement de répondre à la question :

pourquoi faire ?

Merci !
Rémi.




Avatar
Encolpe DEGOUTE
Dans fr.comp.lang.python, remi écrivit:

s_0 = dict['s_0']
s_1 = dict['s_1']
s_2 = dict['s_2']
s_3 = dict['s_3']
s_4 = ...


je vois pas l'intérêt de la chose... pourquoi ne pas utiliser
directement le dictionnaire, c'est bien plus propre ??


Euh, comment ? J'ai pas assez RTFM ?
Merci.
Rémi.


enfin, si tu y tiens vraiment, tu peux faire ça avec des exec() :
for i in dict: exec(i+"=dict[i]")


Ca fonctionne ! Merci.
Pour info, voici le code :

dict = {}
for item in contents_list:
dict["s_%d" % len(dict)] = item
for i in dict: exec(i+"=dict[i]") # permet de créer les n variables s_i

Pas très élegant ?


J'ai une question bête: y aurait-il un rapport avec la facheuse tendance
de PHP à demander des nouveau nom de variable pour chaque objet stocké
dans un tableau ?

--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales



Avatar
remi
Bonjour,

C'est pour ça que je parle, maladroitement, de nom de variables dynamique.


Et surtout que vous évitez soigneusement de répondre à la question :
pourquoi faire ?


Arf, oui, c'est vrai, désolé.
Mon projet est d'alimenter une FAQ (PHP+Mysql) à partir d'une fichier
*.tex très simple. Pour info, c'est une FAQ "droit et TICE".

Le *.tex ressemble par endroits à ça :
###########
[...]
section{Sites web des étab scolaires}

Ici on va parler de ce qui est dans le titre

subsection{Puis-je mettre la photo d'un élève sur la page d'acc ?}

Et ben non, car d'après l'article XXX du code tant et d'après telle
jurisprudence et le bon sens !...

subsection{Que dois-je faire avec les "logs" de
connexion Internet des utilisateurs ?}

les diffuser dans la presse locale...
############

Pour cela, un script python m'enverrai les titre des sections, texte
d'intro de section, titres de subsection, réponse dans un base de
données et ce de manière +/- automatisée...

On m'a conseillé de d'abord le convertir en xml valide (mais pas plus)
d'où mes questions actuelles. Pourquoi ? Car en xml, il serait plus
facilement manipulable par python (pleins de modules faits pour) pour le
convertir, à nouveau, en un fichier sql prêt à être envoyé dans la db.

J'ai pour le moment découpé mon texte en tranches avec :
###########
sect = r'section{(.*)}'
motif1 = re.compile(sect)
contents_list = re.split(motif1,contents)
###########

contents_list est une liste du type :
['Intro','titre section1', 'texte section1 avec les
subsections','section2'....]

J'ai essayé ça :

############
dict = {}
for item in contents_list:
dict["s_%d" % len(dict)] = item
for i in dict: exec(i+"=dict[i]") # permet de créer les s_i
############
et maintenant, je pense que cela sera plus simpe à "xmliser" (à coups de
sub())en traitant plus ou moins séparemment les s_i...mais peut-être que
je fais fausse route ?
J''espère ne pas avoir été trop long...
Merci en tout cas.
Rémi


1 2