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 :

Comparer element d'une liste


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut Comparer element d'une liste
    Bonsoir

    Je viens ici pour vous demander de l'aide :

    en fait, j'ai une liste du type :

    L1=["A","B","C","D","E"]
    Et j'ai une autre liste du type :
    L2=[("A","B"),("A","C"), ("B","E") ...] qui signifie en quelque sorte A touche B, A touche C etc ...

    et je souhaiterai comparer chaque paire d'element de ma liste L1, afin de voir s'ils se touchent ..
    Par exemple, comparer :
    A,B
    A,C
    A,D
    A,E
    ....

    Comment pourrais je faire ???

    D'avance merci pour votre aide ...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Isabella83 Voir le message
    en fait, j'ai une liste du type :
    L1=["A","B","C","D","E"]
    Sur une feuille blanche placez les points a', 'b', 'c', 'd', 'e'
    Et j'ai une autre liste du type :
    L2=[("A","B"),("A","C"), ("B","E") ...] qui signifie en quelque sorte A touche B, A touche C etc ...
    Ce sont des arcs orientés de a vers b, a vers c
    et je souhaiterai comparer chaque paire d'élément de ma liste L1, afin de voir s'ils se touchent ..
    Par exemple, comparer :
    A,B
    A,C
    A,D
    A,E
    ....
    Une sorte de fonction arc_exists(a, b) qui retourne True/False...

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def arc_exists(li, s):
        return lambda d: len([ c for c in li if c[0] == s and c[1] == d])
     
    L2=[("A","B"),("A","C"), ("B","E")]
    arc_exists_from_A = arc_exists(L2, "A")
    print "A->C = %s" % arc_exists_from_A("C")
    print "A->X = %s" % arc_exists_from_A("X")

    -W
    PS: Il y a moins de choses à dire qu'hier donc pas la peine de traîner
    notez la construction du lambda...
    Pour l'aspirine: soit une fonction f à deux variables (x, y). on veut créer une fonction fx0 (y) qui soit f(x0, y) (on fixe x = x0)

    arc_exists utilise cela... et pour extraire la compréhension de liste, prendre par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def add(x):
        return lambda y: x + y
    et jouez avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    add2 = add(2)
    print add2(3)
    Je ne commenterai pas la compréhension de liste, je suis sûr qu'on vous aura proposé mieux avant que vous ayez compris.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    merci pour votre reponse, mais au lieu de retourner False/True, j'aimerai incrementer un compteur ... Je peux avec votre methode ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Ben vous voulez comptez quoi?
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Ben vous voulez comptez quoi?
    -W
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # liste des arcs qui commencent par s
    arcs_from = lambda li, s: [ c for c in li if c[0] == s ]
    def arc_exists(li, s):
        return lambda d: len([ c for c in arcs_from(li, s) if  c[1] == d])
     
    ###
    L2=[("A","B"),("A","C"), ("B","E")]
    arc_exists_from_A = arc_exists(L2, "A")
    print "A->C = %s" % arc_exists_from_A("C")
    print "A->X = %s" % arc_exists_from_A("X")
     
    print "ARC count", len(arcs_from(L2, "A"))
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Hmmm

    Python permet d'écrire rapidement des choses "proche" de pas mal d'algos.

    Tant que vous n'aurez pas réfléchit un peu mieux à ce que vous souhaitez, vous avez un problème d'algorithmique ou de conception et pas encore vraiment un problème Python.

    Vu de loin, vous semblez avoir un soucis de vocabulaire. Ce dont vous parlez semble être la partie émergée d'un iceberg... Et list ou dict ne sont peut être pas les structures de données les plus appropriées.
    Note: Vous avez vu que je parle de graphe en voyant çà.

    Si vous avez le courage allez sur http://www.nltk.org/, vous avez pas mal d'algos de traitement de base qui pourraient vous aider à réfléchir plus vite.

    Si vous ne savez pas trop ce que vous voulez et que vous tatonnez en Python, vous allez vous épuiser avant d'avoir testé votre idée.
    Ce qui est dommage car je suis sûr qu'elle est sans doute intéressante.

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

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je n’ai pas lu les derniers posts.
    Voici ma réponse à la première question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from itertools import combinations
     
    L1=["A","B","C","D","E"]
    L2=[("A","B"),("A","C"), ("B","E")]
     
    def arcs_de_L1_dits_par_L2(L1,L2):
        return [ (u+v,(u,v) in L2) for (u,v) in combinations(L1,2) ]
     
    print arcs_de_L1_dits_par_L2(L1,L2)
    [('AB', True), ('AC', True), ('AD', False), ('AE', False), ('BC', False), ('BD', False), ('BE', True), ('CD', False), ('CE', False), ('DE', False)]

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Et bien en fait, ce que je vous ai mi est quelque chose de très très imagé, pour expliquer très vite fait mon problème ! J'ai un peu corrigé mon post, mais merci pour votre aide !

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je partage l’avis de wiztricks: quelqu’un qui ne connaît pas encore bien Python ne doit pas se lancer dans de l’écriture de code si l’algorithme visé n’est pas clairement établi.

    Pour atteindre un algorithme clair, il faut déjà être en mesure de donner un énoncé clair du problème.

    Je regrette, mais
    trouver les lettres que l'on trouve rarement dans deux texte qui se touchent ( en interaction )
    j’ai beau relire, je ne comprends pas ce que ça veut dire.
    Impossible donc de t’aider plus.

    Quel est le sens ici de “rarement“ ?

    Les lettres de faible occurence dans texte1 et de faible occurence aussi dans texte2 ? Avec une liste de lettres rares différente d’un couple à l’autre.

    Ou les lettres qui se trouvent peu fréquemment (statistiquement dans un ensemble de couples de textes contigus) à la fois dans un texte1 et dans un texte2 jointifs ?

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    La fonction renvoie ('AB',True) parce que j’ai écrit (u+v,(u,v) in L2)

    Si tu veux ’AB’, il faut n’écrire que u+v

    Si tu veux (’A’,’B’) il faut écrire (u,v) . Ou plutôt, extraire directement les couples de la liste combinations(L1,2) , sans les dépaqueter dans (u,v) .

    Et si tu ne veux que « quand la reponse vaut True » , il faut mettre un
    if (u,v) in L2 quelque part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from itertools import combinations
     
    L1=["A","B","C","D","E"]
    L2=[("A","B"),("A","C"), ("B","E")]
     
    def arcs(L1,L2):
        return [ tupl for tupl in combinations(L1,2) if tupl in L2  ]
     
    print arcs(L1,L2)
    [('A', 'B'), ('A', 'C'), ('B', 'E')]
    J’ai écrit tupl et non pas tuple, car tuple est un mot réservé.



    Tu remarqueras que la liste obtenue est égale à L2.

    Et si au lieu d’examiner successivement les paires issues de L1, tu regardais quelles sont les paires de L2 dont les lettres se trouvent dans L1 ?

Discussions similaires

  1. [langage] Supprimer un élément dans une liste
    Par myjuna dans le forum Langage
    Réponses: 15
    Dernier message: 06/08/2014, 11h49
  2. cacher un element d'une liste deroulante
    Par fallered dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 18/10/2005, 15h46
  3. Recherche Element dans une liste
    Par hellodelu dans le forum ASP
    Réponses: 7
    Dernier message: 19/08/2005, 10h56
  4. acceder au n iéme element d'une liste std::list
    Par sorari dans le forum SL & STL
    Réponses: 4
    Dernier message: 23/03/2005, 15h21
  5. selectionner le dernier element d'une liste box
    Par adilou1981 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/03/2005, 10h19

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