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]

4 réponses

1 2
Avatar
Christophe
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 !


L'accès au ieme élément d'une liste ou d'un tuple en Python est garatit
en temps constant.

Avatar
Yermat
Christophe wrote:

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 !



L'accès au ieme élément d'une liste ou d'un tuple en Python est garatit
en temps constant.


Pour les listes python peut-être...
J'ai pas trouvé de référence sur la complexité algorithmique de
l'implémentation (à part http://www.norvig.com/python-lisp.html).

L'avantage de ma solution est qu'elle fonctionne aussi pour n'importe
quel itérateur/générateur !

Et n'oublions pas non plus que le programmeur peu aussi hériter de
UserList...

--
Yermat


Avatar
Do Re Mi chel La Si Do
Tu a pris des cours ?




Peut-être m'entraîne-je, avant de me mettre à Perl ?

;o)


Michel Claveau



Avatar
Amaury
Christophe wrote:
L'accès au ieme élément d'une liste ou d'un tuple en Python est
garatit en temps constant.


Pour les listes python peut-être...
J'ai pas trouvé de référence sur la complexité algorithmique de
l'implémentation (à part http://www.norvig.com/python-lisp.html).



Si, les listes et les tuples sont implémentés comme des tableaux de
pointeurs. C'est vrai au moins pour CPython et Jython.

L'avantage de ma solution est qu'elle fonctionne aussi pour n'importe
quel itérateur/générateur !


C'est vrai, surtout que certains itérateurs ne peuvent pas être relus.
(un curseur de base de données, ou readline sur une socket, par exemple)

Mais cette méthode est plus lente pour une 'vraie' liste.
La complexité algorithmique est souvent à mettre en balance avec le
temps de base de l'opération.

--
Amaury


1 2