IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Comprehension de liste sur condtion vectorielle [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Comprehension de liste sur condtion vectorielle
    Bonjour,

    soit les deux listes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = [0,0,1,0,1,0]
    b = [1,2,3,4,5,6]
    Je souhaite extraire les éléments de b pour lesquels a est positif.
    Autrement dit avoir in fine la liste [3,5]

    Ceci ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = [v for v in b if a>0]
    En rusant un peu, je me dépatouille avec ce code là qui donne bien le résultat escompté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = [v for (n,v) in enumerate(b) if a[n]>0]
    Néanmoins, je ne suis pas sûr que ça soit très propre... Y'a-t'il plus "pythonic" comme solution ?

    Idéalement j'aimerais rester en python pur mais s'il existe une solution élégante avec un module, je suis preneur !
    Par exemple, j'avais pensé à numpy mais np.where() ne donne pas ce que je souhaite. Il me semble que np.where renverra toujours un vecteur de la même taille que ses arguments...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    np.where(np.array(a)>0, b, None)
    Merci d'avance pour vos retours éclairés

    D.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 965
    Points : 24 571
    Points
    24 571
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par DonutMan Voir le message
    Ceci ne marche pas : c = [v for v in b if a>0]
    Oui c'est évident. Déjà rien que pour toi, qu'est censé signifier "si une liste est supérieure à 0"??? Alors pour Python...
    Il faut bien prendre conscience qu'une expression "en intension" n'est que l'écriture simplifiée d'une boucle "for"...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    final=[]
    for x in liste:
    	if condition: final.append(x)
    ... qui se réécrira alors final=[x for x in liste if condition]. La condition, elle, ne change pas. Donc si la condition est mauvaise dès le départ, ce n'est pas en la réécrivant dans l'expression simplifiée que ça la rendra correcte.

    Citation Envoyé par DonutMan Voir le message
    Néanmoins, je ne suis pas sûr que ça soit très propre... Y'a-t'il plus "pythonic" comme solution ?
    Déjà question propreté il sera bon de se demander si la liste se justifie pour un truc qui n'évolue pas (pour ça il y a le tuple).
    Ensuite puisque ton code présuppose "a" et "b" de même taille, alors il y a le zip... c=tuple(y for (x, y) in zip(a, b) if x > 0)...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    novembre 2010
    Messages
    2 979
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 979
    Points : 8 242
    Points
    8 242
    Par défaut
    salut,

    avec numpy on peut faire un truc dans ce goût là, sans dire que c'est mieux/plus pythonic :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a = np.array([0,0,1,0,1,0], dtype='bool')
    b = np.array([1,2,3,4,5,6])
    b[a]

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 965
    Points : 24 571
    Points
    24 571
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    sans dire que c'est mieux/plus pythonic
    Je sais pas si c'est plus/moins pythonic mais en tout cas terminer par un simple b[a] c'est classe !!!
    Faut vraiment que je me mette à numpy moi...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Bonjour,
    merci à vous pour vos retours rapides
    J'ai modifié mon code en conséquence

    A bientôt,

    D.

  6. #6
    Membre actif Avatar de LeNarvalo
    Homme Profil pro
    Modder
    Inscrit en
    février 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Modder
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 128
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Faut vraiment que je me mette à numpy moi...
    J'utilise très superficiellement numpy avec cv2, qui sont les fous qui ont créé ce truc imbitable et inutilisable avec des boucles et des conditions ???

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 17 698
    Points : 30 544
    Points
    30 544
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    J'utilise très superficiellement numpy avec cv2, qui sont les fous qui ont créé ce truc imbitable et inutilisable avec des boucles et des conditions ???
    numpy et cv2 sont des bibliothèques spécialisées et optimisées (écrites en C).

    On peut faire ce genre de choses sur des domaines "stables" (côté algorithmes) pour lesquels nombre de cas d'utilisation (ce qu'on en attend) sont bien définis.

    La difficulté lorsqu'on veut utiliser ces joujoux est d'arriver à se mettre dans la peau de ceux pour qui il a été destiné pour comprendre comment sont construites les solutions proposées.

    On a un peu le même soucis avec le Python de base. Au début on fait des exercices pour apprendre boucles, conditions, listes,... puis lorsqu'on en a marre de répéter les mêmes constructions, on va trouver une bibliothèque standard, une fonction qui... Et il n'y a rien de plus frustrant pour le débutant qui patauge à écrire des trucs simples de voir que les plus avancés utiliseront des "trucs" qu'il ignore.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre actif Avatar de LeNarvalo
    Homme Profil pro
    Modder
    Inscrit en
    février 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Modder
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 128
    Points : 218
    Points
    218
    Par défaut
    Yeap, mais c'est quand même le seul module que j'ai rencontré avec lequel les bases de python servent presque à rien, nan ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> import numpy as np
    >>> a = np.array([1,2,3])
    >>> b = np.array([4,5,6])
    >>> c = np.array([1,2,3])
    >>> l = [a,b]
    >>> for ar in l:
    	if ar == c:
    		print("ok")
     
    Traceback (most recent call last):
      File "<pyshell#8>", line 2, in <module>
        if ar == c:
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

    C'est sûrement là pour une bonne raison, mais c'est quand même pas très intuitif... S'il faut se coltiner la documentation pour faire ce genre de truc ultra basique !

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 17 698
    Points : 30 544
    Points
    30 544
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    S'il faut se coltiner la documentation pour faire ce genre de truc ultra basique !
    Ah non c'est pire... on peut survoler la documentation sans rien trouver car il faut au préalable, s'imprégner des principes pour arriver a en comprendre la logique.

    Ici on est confronté à celle des développeurs qui se sont posé la question de savoir comment évaluer une expression avec des tableau pour sortir un booléen.

    Est ce que çà doit être évalué à True si au moins un des éléments est True ou si tous les éléments sont évalués à True ou encore si le tableau est de taille non nulle (ce que fait Python)? Pour le coup, il a été décidé de lever une erreur et de laisser le soin au codeur de préciser ce qu'il veut... (ici (ar-c).all() par exemple).
    Dit comme çà, çà peut avoir du sens et une certaine logique... mais c'est clair que c'est pas facile à capter lorsqu'on se prend ce genre d'erreur dans les dents (heureusement qu'il y a des forums et Google pour retrouver tout çà).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre chevronné

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    mars 2013
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : mars 2013
    Messages : 1 111
    Points : 2 082
    Points
    2 082
    Par défaut
    La philosophie de numpy c'est de faire des opérations sur les tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import numpy as np
    a = np.array([1,2,3])
    b = np.array([4,2,6])
     
    print(a+b)     #### [5,4,9]
    print(a==b)   #### [False,True,False]
    La force c'est que effectivement, bon nombre d'opération qu'on fait classiquement avec une itération sur le tableau, et bien on n'a pas à écrire l'itération. La conséquence c'est que toute opération arithmétique entre 2 tableaux, ressort en résultat un tableau. Donc forcément si après vous écrivez if a==b, et bien vous n'évaluez pas un booléen, mais un tableau de booléen. Et numpy, dans son message d'erreur, vous donne bien gentillement les fonctionnalités qu'ils proposent pour décider de la valeur vrai/faux globale d'un tableau constitué de valeur vrai/faux.

    La syntaxe de numpy est très complète, et c'est certainement pour ca que tu as l'impression que de connaitre python ne sert pas pour utiliser numpy. Mais en fait numpy n'a rien inventé: ce sont des syntaxes extrêmement proche de Matlab/scilab, ou encore de la librairie Eigen en C++, ou encore de certaine structure Fortran. Tout ceci étant conçu pour faire du calcul scientifique, c'est à dire quand vous manipulez des tableaux avec des millions d'éléments. Dans ce cas là, on pourrait aussi faire en python classique avec des listes de listes et tout, sauf que la même chose en numpy sera au minimum 10 fois plus rapide. Donc par exemple, si c'est pour calculer la météo du lendemain c'est quand même assez intéressant que le calcul ne mettent que 8H à se faire et pas une semaine ...

  11. #11
    Membre actif Avatar de LeNarvalo
    Homme Profil pro
    Modder
    Inscrit en
    février 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Modder
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 128
    Points : 218
    Points
    218
    Par défaut
    @lg_53 Merci pour ces explications !
    En effet il suffisait de faire if (a==b).all() : pour s'assurer que les 2 aires soient similaires.
    J'ai opté sur le moment pour une autre solution consistant à ajouter un index pour chaque aire présente dans ma liste d'aires.

    PS :
    En faite le print me renvoie un truc bizarre sans virgule, quesaquo ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(a==b)
    [False  True False]

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 965
    Points : 24 571
    Points
    24 571
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    En faite le print me renvoie un truc bizarre sans virgule, quesaquo ?
    => type => print(a==b, type(a==b)) et ça quesaquora
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 17 698
    Points : 30 544
    Points
    30 544
    Par défaut
    Salut,

    Citation Envoyé par LeNarvalo Voir le message
    En faite le print me renvoie un truc bizarre sans virgule, quesaquo ?
    C'est l'affichage normal d'un tableau numpy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import numpy as np
    >>> ar = np.array([1,2,3])
    >>> print(ar)
    [1 2 3]
    >>>
    Pour explorer les possibilités de numpy, le plus simple sera d'ouvrir un tuto. ou de lire la documentation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/08/2006, 13h17
  2. liste sur formulaire
    Par milielf dans le forum Access
    Réponses: 10
    Dernier message: 18/05/2006, 15h35
  3. [PHP-JS] Afficher une liste sur la page ?
    Par bzoler dans le forum Langage
    Réponses: 7
    Dernier message: 27/01/2006, 09h41
  4. [Struts]Affiche d'une liste sur plusieurs pages
    Par guillaume_85 dans le forum Struts 1
    Réponses: 3
    Dernier message: 24/06/2005, 20h23
  5. Même liste sur 26 pages différentes
    Par krfa1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 18/03/2005, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo