Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/10/2006, à 15: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, à 17: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 roll ?

Hors ligne

#3 Le 10/11/2006, à 12: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, à 15: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 big_smile
Qu'y perds-tu ?
=> La lisibilité et la simplicité de ton code sad

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 hmm

Hors ligne

#5 Le 10/11/2006, à 17: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.