Python >> Tutoriel Python >  >> Python

Variable intermédiaire dans une compréhension de liste pour le filtrage et la transformation simultanés

Is this really the best way?

Eh bien, cela fonctionne efficacement et si vous voulez vraiment, vraiment écrire des oneliners, c'est le mieux que vous puissiez faire.

Par contre, une simple fonction de 4 lignes ferait la même chose beaucoup plus clairement :

def normfilter(vecs, min_norm):
    for x,y in vecs:
        n = (x**2.+y**2.)**-0.5
        if min_norm < n:
            yield (x*n,y*n)

normalized = list(normfilter(vectors, 0.4))

Au fait, il y a un bogue dans votre code ou votre description - vous dites que vous filtrez les vecteurs courts mais votre code fait le contraire :p


À partir de Python 3.8 , et l'introduction des expressions d'affectation (PEP 572) (:= opérateur), il est possible d'utiliser une variable locale au sein d'une liste en compréhension afin d'éviter d'appeler plusieurs fois la même expression :

Dans notre cas, nous pouvons nommer l'évaluation de (x**2.+y**2.)**-.5 sous forme de variable n en utilisant le résultat de l'expression pour filtrer la liste si n est inférieur à 0.4; et donc réutiliser n pour produire la valeur mappée :

# vectors = [(1, 1), (1, 2), (2, 2), (3, 4)]
[(x*n, y*n) for x, y in vectors if (n := (x**2.+y**2.)**-.5) < .4]
# [(0.7071067811865476, 0.7071067811865476), (0.6000000000000001, 0.8)]