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 :

Appliquer une fonction aux éléments d'une liste


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 96
    Points : 62
    Points
    62
    Par défaut Appliquer une fonction aux éléments d'une liste
    Bonjour.

    Je débute en python et je cherche à faire un truc tout simple …

    Chacun sait que pour élever tous les éléments d'une liste Z au carré, il suffit d'employer par exemple.
    De même, si on veut additionner les éléments de deux listes X et Y pour mettre les totaux dans une troisième liste Z, il suffit d'écrire Je voulais savoir si on pouvais généraliser ça en écrivant un truc du type où ma_fonction prend en paramètres les éléments de la liste X un par un et stocke les valeurs retournées dans la liste Z. Il va de soit que Z et X auraient dans ce cas un "shape" identique.

    Tout ça pour quoi, me direz vous ? Tout simplement pour des questions de performance : si je peux économiser des boucles "for" ….

    Voilà, si quelqu'un peut m'aider, je suis preneur.
    Merci par avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Points : 704
    Points
    704
    Par défaut
    bonjour,
    si tu veux appliquer une fonction aux éléments d'une il faudra forcément itérer dessus un moment où un autre, ça peux être dans la fonction, ou bien ailleurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def ma_fonction(iterable):
    	for element in iterable:
    		print(i)
     
    a = [1,2,3]
    ma_fonction(a)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def ma_fonction(element):
    	print(i)
     
    a = [1,2,3]
    for element in a:
    	ma_fonction()
    si non tu peux utiliser des list comprehension [ma_fonction(element) for element in iterable], le concept de list comprehension puissant mais comme toute chose avancée dans un domaine il faut avoir les bases solidement acquises.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 899
    Points : 6 674
    Points
    6 674
    Par défaut
    J'imagine qu'il y a un foultitude de tutoriels à ce sujet sur developpez.net (n'hésite pas à t'y plonger), mais voici l'adresse d'un blog que j'aime bien: https://bogotobogo.com/python/python...prehension.php.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    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 : 21 352
    Points : 36 879
    Points
    36 879
    Par défaut
    Salut,

    Citation Envoyé par amauryxiv Voir le message
    Chacun sait que pour élever tous les éléments d'une liste Z au carré, il suffit d'employer par exemple.
    De même, si on veut additionner les éléments de deux listes X et Y pour mettre les totaux dans une troisième liste Z, il suffit d'écrire
    Mouais, chacun sait ce qu'il veut mais le problème est que Python ne sait pas faire çà avec une liste, par contre, avec un array numpy...

    Citation Envoyé par amauryxiv Voir le message
    Je voulais savoir si on pouvais généraliser ça en écrivant un truc du type où ma_fonction prend en paramètres les éléments de la liste X un par un et stocke les valeurs retournées dans la liste Z.Il va de soit que Z et X auraient dans ce cas un "shape" identique.
    Donc si la chose est un array numpy, vous avez apply_along_axis, vectorize, ... pour appliquer une fonction aux éléments d'un tableau. Donc on peut....

    - W

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par amauryxiv Voir le message
    Tout ça pour quoi, me direz vous ? Tout simplement pour des questions de performance : si je peux économiser des boucles "for" ….
    Bonjour

    Ne te fais pas d'illusion, la boucle se fera toujours à un moment ou à un autre. Tu ne gagneras pas en perfs, seulement en simplicité d'écriture.

    Citation Envoyé par amauryxiv Voir le message
    Voilà, si quelqu'un peut m'aider, je suis preneur.
    Pour le carré c'est direct
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    item1=(1, 2, 3, 4, 5, 6)
    item2=tuple(x**2 for x in item1)

    Pour la somme on peut y arriver mais faut passer par des outils que tu ne connais probablement pas encore (comme "zip")
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    item1=(1, 2, 3, 4, 5, 6)
    item2=(7, 8, 9, 10, 11, 12)
    item3=tuple(x + y for (x, y) in zip(item1, item2))

    Et comme tu vois, je reste en tuples car justement pour des questions de performances je ne vois pas pourquoi j'utiliserais des listes quand mon truc n'a pas besoin d'évoluer. Evidemment si ensuite ton "item1" ou "item2" ou "item3" doivent évoluer par la suite, alors les mettre en liste fonctionne aussi.

    Ensuite tu as des modules dédiés aux traitements plus complexes comme numpy évoqué par wiztricks. Et comme ces modules sont généralement écrits en C, là en plus tu peux alors gagner en perfs (mais pour que ce soit visible il faut que tes items soient de l'ordre du millier de valeurs).

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 96
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Mouais, chacun sait ce qu'il veut mais le problème est que Python ne sait pas faire çà avec une liste, par contre, avec un array numpy...



    Donc si la chose est un array numpy, vous avez apply_along_axis, vectorize, ... pour appliquer une fonction aux éléments d'un tableau. Donc on peut....

    - W
    Bonjour wiztricks et les autres.


    Merci à tous pour votre aide.


    En effet, il s'agit bien un array numpy. Bien vu !! . Je vais potasser les fonctions dont vous me parlez, j'espère y trouver mon bonheur.
    Pour préciser un peu mon besoin, mon array est en réalité un tableau de nombres complexes de deux dimensions.

  7. #7
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    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 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Dans le cas de variables qui sont des np.array, tu peux en effet généraliser l'écriture suivante :

    à condition que dans le code de ma_fonction, il n'y ait que des opérations autorisées en numpy (sinon ca va te faire au mieux un message d'erreur, au pire n'importe quoi). Donne un ou plusieurs exemples de fonctions qui t'intéresseraient, on te dira.

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 96
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Dans le cas de variables qui sont des np.array, tu peux en effet généraliser l'écriture suivante :

    à condition que dans le code de ma_fonction, il n'y ait que des opérations autorisées en numpy (sinon ca va te faire au mieux un message d'erreur, au pire n'importe quoi). Donne un ou plusieurs exemples de fonctions qui t'intéresseraient, on te dira.
    Salut lg_53 !!
    Merci infiniment pour ta réponse.

    Alors cette écriture, je l'ai déjà essayée, avec par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ma_fonction(X):
        return X**2
    et il m'a semblé que ça ne marchait pas: en effet, quand je passais au debugger, le paramètre X de la fonction était un tableau (numpy)…

    C'est ce qui m'a poussé à venir ici.

  9. #9
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    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 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import numpy as np
     
    X = np.array([[1,2,3],[4,5,6]])
    print(X)
    print(X**2)
     
    def carre(X):
        return X**2
     
    print(carre(X))
    Ceci fonctionne bien chez vous non ? Et du coup, voyez que cela fonctionne...

  10. #10
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 96
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Ceci fonctionne bien chez vous non ? Et du coup, voyez que cela fonctionne...
    C'est un mauvais exemple, car cela fonctionne aussi si votre fonction prend le tableau en paramètre. J'ai passé votre code au debugger et effectivement le paramètre passé à la fonction carre() est bien le tableau X et non pas ses éléments un par un...

  11. #11
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    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 229
    Points : 2 328
    Points
    2 328
    Par défaut
    C'est justement l'intérêt des arrays : vous passer tous les tableaux en paramètre d'un seul coup. Pourquoi voudriez vous des paramètres distincts ? Et dans ce cas s'ils sont distincts vos paramètres ne sont pas des tableaux, mais de simples valeurs ... Je ne comprends pas votre besoin.

  12. #12
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 96
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    C'est justement l'intérêt des arrays : vous passer tous les tableaux en paramètre d'un seul coup. Pourquoi voudriez vous des paramètres distincts ? Et dans ce cas s'ils sont distincts vos paramètres ne sont pas des tableaux, mais de simples valeurs ... Je ne comprends pas votre besoin.
    En fait, dans mon idée, je voulais pouvoir créer une fonction m_fonction prenant en paramètre par exemple un entier et retournant un entier, puis écrire ensuite où X et Z sont des tableaux d'entiers…
    Mais peut être que cela n'apporte effectivement pas grand chose.
    Je vais réfléchir à nouveau…


    Merci à tous ceux qui ont participé.

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par amauryxiv Voir le message
    En fait, dans mon idée, je voulais pouvoir créer une fonction m_fonction prenant en paramètre par exemple un entier et retournant un entier, puis écrire ensuite où X et Z sont des tableaux d'entiers…
    Les deux assertions sont incompatibles. Si la fonction prend un entier, alors X doit être un entier, pas un tableau. Et si on veut traiter un tableau et récupérer un tableau tout en laissant "ma_fonction" prendre un entier et retourner un entier, alors cela se fera sous cette forme Z=tuple(ma_fonction(x) for x in tableau_d_entiers) (ou bien aussi Z=map(ma_fonction, tableau_d_entiers)).

  14. #14
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    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 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import numpy as np
     
    X = np.array([[1,2,3],[4,5,6]])
    print(X)
    print(X**2)
     
    def carre(X):
        return X**2
     
    print(carre(X))
    Ceci fonctionne bien chez vous non ? Et du coup, voyez que cela fonctionne...
    Dans l'exemple que je vous donne ici vous pouvez aussi très bien écrire
    Donc vous avez le choix sur le type des paramètres ! Vous lui donnez un entier elle vous renvoit un entier. Vous lui donnez un array, elle vous renvoie un array.

  15. #15
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 96
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Les deux assertions sont incompatibles. Si la fonction prend un entier, alors X doit être un entier, pas un tableau. Et si on veut traiter un tableau et récupérer un tableau tout en laissant "ma_fonction" prendre un entier et retourner un entier, alors cela se fera sous cette forme Z=tuple(ma_fonction(x) for x in tableau_d_entiers) (ou bien aussi Z=map(ma_fonction, tableau_d_entiers)).

    Bonsoir à tous.


    Merci Sve@r, c'est ça que je cherche à faire, sans savoir comment.
    Maintenant si j'en ai besoin je connaitrai la solution.

    En revanche, est ce que ta solution est plus performante qu'une simple boucle sur les éléments du tableau ?

    Merci encore.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    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 : 21 352
    Points : 36 879
    Points
    36 879
    Par défaut
    Citation Envoyé par amauryxiv Voir le message
    En revanche, est ce que ta solution est plus performante qu'une simple boucle sur les éléments du tableau ?
    Et si vous testiez cela par vous même?
    Un peu de recherche sur Internet vous donnerait exemples, profils de performances,... et la conclusion que sauf les opérations natives (X = X**2) qui déroulent du C, il y a de petites différences sur les petits tableaux mais çà se vaut dès que c'est un peu gros.

    - W

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par amauryxiv Voir le message
    En revanche, est ce que ta solution est plus performante qu'une simple boucle sur les éléments du tableau ?
    Ce n'est pas "ma" solution mais une solution Python
    La première est issue des "listes en intension" qui permettent de décrire des listes par leur définition (en opposition aux listes en "extension" qui décrivent des listes par l'exemple). Les deux notions font partie de la théorie de l'objet et ont été implémentées dans Python (enfin je parle de la première car la seconde est plus classique et se retrouve dans tous les langages).

    L'autre solution est aussi un truc Python mais là un truc plus spécifique. Toutefois, je ne pense pas que la performance soit vraiment un critère déterminant pour faire un choix. Parce que franchement, si l'une met 3 centièmes de moins que l'autre, est-ce que cela compte vraiment ?
    Je pense que ce qui compte c'est plutôt la concision du code qui permettra une lecture plus rapide donc plus aisée.

  18. #18
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    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 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Vos tableaux font quelle taille ? Pour des grandes tailles, la solutions avec numpy sera la plus performantes, et de loin.

    Notez également que sur la construction en intention vous avez tout de même le mot for donc vous parcourez quand même tout le tableau.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/04/2017, 01h46
  2. [2.x] Ajouter une contrainte aux éléments d'une collection
    Par Gaylord.P dans le forum Symfony
    Réponses: 5
    Dernier message: 11/12/2015, 17h36
  3. [VB.NET] Associer une clé aux éléments d'une combo
    Par Cereal123 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 30/03/2009, 14h52
  4. [Langage] une fonction comme argument d'une fonction?
    Par Krishna dans le forum Langage
    Réponses: 9
    Dernier message: 15/10/2008, 20h31
  5. passage d'une fonction en parametre d'une fonction
    Par psylox dans le forum Langage
    Réponses: 5
    Dernier message: 06/10/2008, 16h40

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