#1 Le 30/10/2006, à 14:43
- monsitt
Besoin d'aide pour list comprehension et Python 2.5
Salut à tous,
Voilà, j'ai installé kubuntu edgy sur ma machine de test (car la mise à jour dapper-->edgy a foiré, enfin bref ... j'ai pas eu le temps de vraiment voir ce qui déconnait ... j'ai donc fait une reinstall) . Par la même j'ai installé python 2.5, je peux donc accéder à la fois à python 2.4 et à python 2.5 (par python2.5 dans le terminal) .
Dans un script je voudrais utiliser une list comprehension utilisant un else (if/elif/else), ce qui n'est pas possible dans python 2.4 (j'ai vérifié) . C'est maintenant possible dans python 2.5 (une des nombreuses nouveautés) .
Je voudrais transformer ceci :
newimage=[]
for toto in range(nb_pixels) :
# Traitement ... (entre autre recup de R, G et B)
if ... :
newimage.append((255,255,255,0))
else :
newimage.append((R, G, B, 255))
... en list comprehension ==> [b for b in a if ...] .
En sachant que la syntaxe pour Python 2.5 est la suivante :
" However, in Python 2.5, a slightly different grammar is used that is more backwards compatible, but constrains the grammar of a lambda used in this position by forbidding the lambda's body to contain an unparenthesized condition expression. Examples:
[f for f in (1, lambda x: x if x >= 0 else -1)] # OK
[f for f in 1, (lambda x: x if x >= 0 else -1)] # OK
[f for f in 1, lambda x: (x if x >= 0 else -1)] # OK
[f for f in 1, lambda x: x if x >= 0 else -1] # INVALID "
==> Vu ici : http://www.python.org/dev/peps/pep-0308/ .
Dans la syntaxe au-dessus on ne traite qu'une donnée, mais moi je veux en traiter plusieurs . Ce qui me gène c'est que j'arrive pas à adapter les expressions lambda pour la circonstance . Comment faire ? . Quelqu'un peut-il me donner un coup de main ? .
Pourquoi utiliser une list comprehension me direz-vous ?, --> c'est un gain de temps manifeste sur le calcul (entre autre) .
En espérant que vous pourrez m'aider .
a+
Hors ligne
#2 Le 30/10/2006, à 16:30
- ArBaDaCarBa
Re : Besoin d'aide pour list comprehension et Python 2.5
Je ne suis pas sur de bien comprendre le problème...
Je suppose que c'est plus compliqué que :
[ f,g,h for f in (1, lambda...) for g in (1, lanmbda...) for h in (1, lambda...)
non ?
Hors ligne
#3 Le 10/11/2006, à 11:44
- jean-pierre milin
Re : Besoin d'aide pour list comprehension et Python 2.5
Bonjour,
Il me semble que d'après votre exemple la liste compréhensive ne doit pas comporter de "if", sinon
tous les pixels ne seront pas générés... Le test est plutot à faire dans l'expression avant.
La structure générale serait celle-ci :
def traitement(i):
# traitement du pixel i
if ... :
return (255,255,255)
else :
return (R,G,B)
image = [traitement(i) for i in xrange(nbpixel)]
#4 Le 10/11/2006, à 14:27
- supergromz
Re : Besoin d'aide pour list comprehension et Python 2.5
Je n'ai lu ce sujet que dans les grandes lignes mais, un des preceptes fondamentaux de Python est: 'Explicit is better than implicit' (explicite est mieux qu'implicite).
[mode 'prechi precha' ON]
Or ici tu essaies de réduire en 1 ligne un traitement qui t'en prendrait 4 ou 5 (je schematise).
Qu'y gagnes-tu?
=> ton fichier est plus léger de 8 octets
Qu'y perds-tu ?
=> La lisibilité et la simplicité de ton code
Les list comprehensions c'est bien, en abuser, ça l'est moins...
Dit plus simplement: si tu n'arrives pas à factoriser ton code en une 'list comprehension' aujourd'hui, comment réagiras-tu dans 2 mois quand tu replongeras le nez dans ton code?
[mode 'prechi precha' OFF]
Et pour repondre a ta question initiale, je ne sais pas
Hors ligne
#5 Le 10/11/2006, à 16:45
- aleph
Re : Besoin d'aide pour list comprehension et Python 2.5
Je m'étais penché sur ce problème et n'avais pas trouvé de solution satisfaisante, aussi n'avais-je pas répondu.
Je partage l'avis de supergromz.
La solution proposée par jean-pierre milin, qui, si elle paraît élégante, n'en est pas une. Si techniquement, elle est correcte, elle représente à mon avis un mauvais exemple d'une "list comprehension". Dans ce cas, l'ensemble de départ xrange(nbpixedl) n'est pas de la même essence que l'ensemble d'arrivée.
Je n'ai pas de solution ad hoc à ce problème. Dans l'idée d'un optimisation mémoire/vitesse, je tenterais cette approche : une modifidaction in place d'une listes de listes de 3 entiers.