OVH Cloud OVH Cloud

Une question pour les gros cerveaux

14 réponses
Avatar
jean-michel
Bonsoir,
Lorsque l'on boucle sur une liste, il est parfois nécessaire, utile, et
agréable d'accéder à l'élément n-1 si l'élément courant est n.
J'ai toujours tenu pour acquis que la seule méthode pour avoir l'index
de l'élément courant (et donc de pouvoir calculer celui de n'importe
quel autre élément) est un range(len(liste)), comme dans la boucle 2 du
programme ci-après.
Mais si quelqu'un a mieux à proposer, genre un mot magique donnant
l'index en cours dans une boucle, je suis preneur.
A+
jm

liste= ['a','x','b','z']
for l in liste:
print 'boucle 1: l=',l,' l-1 est inconnu'
for l in range(len(liste)):
print 'boucle 2: l=',liste[l],' l-1=',liste[l-1]

10 réponses

1 2
Avatar
Amand Tihon
jean-michel wrote:

Bonsoir,
Bonsoir,


Lorsque l'on boucle sur une liste, il est parfois nécessaire, utile , et
agréable d'accéder à l'élément n-1 si l'élément courant est n.
J'ai toujours tenu pour acquis que la seule méthode pour avoir l'in dex
de l'élément courant (et donc de pouvoir calculer celui de n'impo rte
quel autre élément) est un range(len(liste)), comme dans la boucl e 2 du
programme ci-après.
Mais si quelqu'un a mieux à proposer, genre un mot magique donnant
l'index en cours dans une boucle, je suis preneur.


Utilise enumerate :

py> liste = ['a','x','b','z']
py> for i, l in enumerate(liste):
... print 'index: %i, element: %s' % (i, l)
...
index: 0, element: a
index: 1, element: x
index: 2, element: b
index: 3, element: z
py>

--
Amand Tihon

Avatar
Do Re Mi chel La Si Do
Bonsoir !

Comme l'a dit Armand Tihon :

for l,v in enumerate(liste):
print 'boucle 3: l=',v,' l-1=',liste[l-1]



Ou, avec une variable :

prec=liste[-1]
for l in liste:
print 'boucle 4: l=',l,' l-1=',prec
prec = l



@-salutations

MCI
Avatar
jean-michel
Amand Tihon wrote:

Utilise enumerate :

py> liste = ['a','x','b','z']
py> for i, l in enumerate(liste):
... print 'index: %i, element: %s' % (i, l)
...
index: 0, element: a
index: 1, element: x
index: 2, element: b
index: 3, element: z
py>



Sympa , je prends !
Merci, c'est cool !
A+
jm

Avatar
Bruno Desthuilliers
Bonsoir,
Lorsque l'on boucle sur une liste, il est parfois nécessaire, utile, et
agréable d'accéder à l'élément n-1 si l'élément courant est n.
J'ai toujours tenu pour acquis que la seule méthode pour avoir l'index
de l'élément courant (et donc de pouvoir calculer celui de n'importe
quel autre élément) est un range(len(liste)), comme dans la boucle 2 du
programme ci-après.


liste= ['a','x','b','z']
for i, l in enumerate(liste):
try:
lm = liste[i-1]
except IndexError:
lm = 'None'
print 'boucle 3: l=%s - l-1=%s' % (l, lm)

Avatar
Yermat
jean-michel wrote:
Bonsoir,
Lorsque l'on boucle sur une liste, il est parfois nécessaire, utile, et
agréable d'accéder à l'élément n-1 si l'élément courant est n.
J'ai toujours tenu pour acquis que la seule méthode pour avoir l'index
de l'élément courant (et donc de pouvoir calculer celui de n'importe
quel autre élément) est un range(len(liste)), comme dans la boucle 2 du
programme ci-après.
Mais si quelqu'un a mieux à proposer, genre un mot magique donnant
l'index en cours dans une boucle, je suis preneur.
A+
jm

liste= ['a','x','b','z']
for l in liste:
print 'boucle 1: l=',l,' l-1 est inconnu'
for l in range(len(liste)):
print 'boucle 2: l=',liste[l],' l-1=',liste[l-1]


Attention avec les solutions que vous avez eu. Elles peuvent en effet
avoir une très mauvaise complexité algorithmique. L'accès au ième
élément est une opération complexe !

Si vous voulez juste avoir accès à l'élément précédent, il vaut mieux
vous construire un itérateur ou un générateur qui fasse cela en temps
constant.

def SuiteIt(it):
... prev = None



... for item in it:
... yield (prev, item)
... prev = item
...
for (prev, cur) in SuiteIt(range(10)):
... print "The predecessor of ", cur, "is", prev



...
The predecessor of 0 is None
The predecessor of 1 is 0
The predecessor of 2 is 1
The predecessor of 3 is 2
The predecessor of 4 is 3
The predecessor of 5 is 4
The predecessor of 6 is 5
The predecessor of 7 is 6
The predecessor of 8 is 7
The predecessor of 9 is 8

--
Yermat



Avatar
jean-michel
jean-michel wrote:
Bonsoir,
Lorsque l'on boucle sur une liste, il est parfois nécessaire, utile, et
agréable d'accéder à l'élément n-1 si l'élément courant est n.
J'ai toujours tenu pour acquis que la seule méthode pour avoir l'index
de l'élément courant (et donc de pouvoir calculer celui de n'importe
quel autre élément) est un range(len(liste)), comme dans la boucle 2 du
programme ci-après.
Mais si quelqu'un a mieux à proposer, genre un mot magique donnant
l'index en cours dans une boucle, je suis preneur.
A+
jm

liste= ['a','x','b','z']
for l in liste:
print 'boucle 1: l=',l,' l-1 est inconnu'
for l in range(len(liste)):
print 'boucle 2: l=',liste[l],' l-1=',liste[l-1]


Bonjour,

En synthèse, la solution que je préfère est celle avec enumerate (voir
ci-après). Je trouve qu'elle est simple et a les mêmes possibilités que
le range(len(liste)) en étant plus élégante.
Et, dont acte, et elle est dans le tutorial (chap 5.6, looping
techniques), comme la plupart des trucs importants. J'aurais mieux fait
de le relire une fois de plus avant de poser la question. Et toc.
Merci beaucoup de vos réponses.
A+
jm

liste= ['a','x','b','z']
for l in liste:
print 'boucle 1: l=',l,' l-1 est inconnu'
for l in range(len(liste)):
print 'boucle 2: l=',liste[l],' l-1=',liste[l-1]
for i,l in enumerate(liste):
print 'boucle 3: l=',l,' l-1=',liste[i-1]

Avatar
Rakotomandimby (R12y) Mihamina
jean-michel :

Je trouve qu'elle est simple


Non, Yermat vient d'annoncer qu'il faut s'attendre à ce que ce soit
"complexe", justement... Donc pas si "simple" que ça...

Quel jeu de mot!...

Avatar
jean-michel
Rakotomandimby (R12y) Mihamina wrote:
jean-michel :


Je trouve qu'elle est simple



Non, Yermat vient d'annoncer qu'il faut s'attendre à ce que ce soit
"complexe", justement... Donc pas si "simple" que ça...

Quel jeu de mot!...

Oui, oui, mais je préfère la solution simple qui est complexe, que la

solution compliquée mais en fait plus simple...
Allez, un aspro, une tisane et au lit...


Avatar
Do Re Mi chel La Si Do
'soir !

Mais la complexité de la réponse qui contient le mot "complexe" entraîne une
dé-simplification de la simple expression d'un besoin tout simple, et de
solutions simples, mais dévalorisées, au profit d'une solution dont la
complexité est simplement plus abstraite.

En fait,la complexité est plus dans l'oeil du lecteur, que sous la plume du
développeur.

@-salutations

Michel Claveau
Avatar
bruno at modulix
Do Re Mi chel La Si Do wrote:
'soir !

Mais la complexité de la réponse qui contient le mot "complexe" entraîne une
dé-simplification de la simple expression d'un besoin tout simple, et de
solutions simples, mais dévalorisées, au profit d'une solution dont la
complexité est simplement plus abstraite.



Ah, pas mal là !-)
Tu a pris des cours ?

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

1 2