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 :

Liste à soustraire dans tableau


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Par défaut Liste à soustraire dans tableau
    Bonjour,
    Débutant en python depuis quelques semaines...
    je butte sur un problème de listes...

    J'ai deux listes :
    Liste 1 : [a,b,c,d,e]
    Liste 2 : [(a,1,m),(b,4,j),(h,4,o)]

    Je souhaite pouvoir ne garder que les couples de valeurs de la liste 2 dont la première valeur du couple existe dans la liste 1 (je m'excuse pour le vocabulaire, je ne connais pas encore les termes...)
    soit un résultat sous forme de liste :
    resultat : [(a,1,m),(b,4,j)]

    Si vous avez une idée
    Jérôme

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

    Je souhaite pouvoir ne garder que les couples de valeurs de la liste 2 dont la première valeur du couple existe dans la liste 1 (je m'excuse pour le vocabulaire, je ne connais pas encore les termes...)
    La liste 2 contient des triplets et non des "couples" / "paires"
    Le n-ième élement d'une séquence S s'obtient via S[n].

    Pour construire le résultat que vous voulez, vous devez construire une itération (boucle for) sur les éléments de "liste 2" et tester si son premier éléments est dans "liste 1"

    Moi j'écrirais cela ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> L1 = ['a', 'b', 'c', 'd', 'e' ]
    >>> L2 = [('a', 1, 'm'), ('b', 4, 'j'), ('h', 4, 'o')]
    >>> [ e for e in L2 if e[0] in L1 ]
    [('a', 1, 'm'), ('b', 4, 'j')]
    Je suis conscient que cette construction vous paraisse étrange.

    A vous d'écrire cela avec une boucle "for".

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

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 044
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> Liste_1 = ["a", "b", "c", "d", "e"]
    >>> Liste_2 = [("a", 1, "m"), ("b", 4, "j"), ("h", 4, "o")]
    >>> resultat = [tuple for tuple in Liste_2 if tuple[0] in Liste_1]
    >>> resultat
    [('a', 1, 'm'), ('b', 4, 'j')]
    Edit: Purée, j'avais même pas vu que j'étais...

    grilled

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Par défaut
    Super !
    Je vais essayer de mettre ça en oeuvre.
    Je pensais que l'on pouvait éviter une boucle for et qu'une commande directe existait (ma liste 2 frôle les 100 000 enregistrements...)
    Merci pour votre aide !!
    Jérôme

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

    Il n'est pas toujours réaliste d'utiliser un algorithme "acceptable" pour une liste de quelques éléments à une liste de 100 000 éléments.

    Quelle sera la place mémoire occupée par le tout et son résultat?

    Ne vaudrait il pas mieux utiliser un SGDB après avoir contraint la première colonne a être indexée?

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

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Par défaut
    pour l'instant je n'arrive pas à appliquer mon opération.
    En fait, je pensais pouvoir extrapoler, mais je bloque car j'ai en fait :
    Liste_1 = [("h",4),("e",8)]
    Liste_2 =[["a", 1, "m"], ["b", 4, "j"], ["h", 4, "o"]]
    et je dois donc comparer sur la paire des deux premiers attributs du triplet pour donner
    resultat = [["h",4,"0"]]

    Je verrai ensuite la mémoire que cela me prends sur toutes mes données !!
    Merci
    Jérôme

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

    liste, tuple et iterable sont quand même des types de bases de Python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> L1 = ['a', 'b', 'c', 'd', 'e' ]
    >>> L2 = [('a', 1, 'm'), ('b', 4, 'j'), ('h', 4, 'o')]
    >>> [ e for e in L2 if e[0] in L1 ]
    [('a', 1, 'm'), ('b', 4, 'j')]
    >>> L1 = [ ('h', 4), ('e', 8) ]
    >>> [ e for e in L2 if e[:2] in L1 ]
    [('h', 4, 'o')]
    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 180
    Par défaut Penser à utiliser une comparaison ensembliste
    En python, il existe un type de données dans laquelle les opérations de
    test d'appartenance sont très rapide. C'est la classe set.

    Dans ton cas, cela donne quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/usr/bin/env python
    # -*- coding:UTF-8
    def main():
        ensemble = set([('a',5),('b',4)])
        liste_origine = [['a',5,9],['u',5,-1],['a',5,10]]
        liste_result = [ligne for ligne in liste_origine if tuple(ligne[:2]) in ensemble]
        print liste_result
    if __name__ == '__main__':
        main()
    Cela étant si liste_origine fait dans les 100000 "ligne". Il y a peut être lieu
    de lire le fichier ligne par ligne (par exemple en utilisant le module csv)
    et de faire une bonne vieille boucle for.
    En outre, si liste_result peut être très grosse aussi, on peut la remplacer par
    une écriture dans un fichier (ici aussi le module csv)

    En espérant t'avoir été utile.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Par défaut
    des types de base, c'est vrai... mais quand on débute...
    pas facile de trouver des infos sur les listes et tableaux...
    Merci pour ce bout de code !
    je teste !

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 044
    Par défaut
    pas facile de trouver des infos sur les listes et tableaux
    Euh là t'abuses, ça pullule d'informations concernant listes, tuples, etc... sur le net.

    Sinon utilises ton interpréteur pour tester tes lignes de code, souvent ça se résout simplement.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Par défaut
    Euh, franchement, je galère à trouver des infos sur les manipulations de listes dans les listes... peut être n'ai-je pas encore le bon vocabulaire pour trouver les infos...
    Là je cherche à faire une liste qui prendrait que les premières valeurs de chaque couple...
    Mais je vais trouver !!
    Merci encore !

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Par défaut
    Ben voilà, j'ai trouvé tout seul...
    [e[2] for e in L2]
    le python c'est pas sorcier ! faut juste comprendre les bases...

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 044
    Par défaut
    Ah oui, trouver ta réponse, non! Tu ne trouveras pas, c'est un travail de réflexion et non de syntaxe.

    Pour la syntaxe, il y a tout ce qu'il faut, il faut apprendre à faire des choses simples pour réussir ce que l'on souhaite faire. Et beaucoup d'essais.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 17
    Par défaut
    C'est clair tout est dit !
    Merci encore !

Discussions similaires

  1. Tri dans tableau html via liste déroulante
    Par guispider dans le forum Langage
    Réponses: 7
    Dernier message: 18/02/2009, 17h31
  2. Affichage d'une liste double dans un tableau
    Par G3G3 dans le forum Tkinter
    Réponses: 2
    Dernier message: 08/07/2008, 10h32
  3. Faire apparaitre une liste déroulante dans un tableau
    Par AsQuel dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/07/2007, 17h20
  4. liste les repertoires dans tableau
    Par bleuerouge dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 28/05/2007, 10h52
  5. Réponses: 1
    Dernier message: 02/04/2007, 15h56

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