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 2 listes pour en faire une troisième


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 19
    Points : 10
    Points
    10
    Par défaut comparer 2 listes pour en faire une troisième
    Bonsoir
    Je me casse encore la tête avec les listes.
    J'ai deux listes. La première contient 20 données, l'ordre ne doit pas être modifié, ces données fonctionnent par 2 même si je n'ai pas eu besoin de les regrouper par deux (je ne sais d'ailleurs pas le faire)
    l1=[100009,9, 100005,5,1004,4,1003,3,108,8,107,7,16,6,0,10,0,2,0,1] et ceux sont les couples qui m'intéressent (1004,4), (108,8) etc
    la seconde peut être de longueur variable
    l2=[93,9,56,4,44,3]
    Je voudrais obtenir une 3eme liste qui contienne les éléments de l1 et de l2 en additionnant la 1ere occurence, lorsque la 2eme est commune à l1 et l2, et en laissant à l'identique les éléments de l1 qui ne sont pas dans l2, le tout dans le même ordre
    l3=[100102,9, 100005,5,1060,4, 1047,3,108,8,107,7,16,6,0,10,0,2,0,1]
    mission impossible?
    Merci de votre aide
    Eljoj

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    l1=[100009,9, 100005,5, 1004,4, 1003,3, 108,8, 107,7, 16,6, 0,10, 0,2, 0,1]
     
    l2=[93, 9, 56, 4, 44, 3]
     
    # regroupement des éléments de l1 2 par 2
    L = [[l1[i*2], l1[i*2+1]] for i in range(len(l1)//2)]
     
    l3 = []
    for i, (x, y) in enumerate(L):
        if y in l1 and y in l2:
            l3.append(x+l2[i])
            l3.append(y)
        else:
            l3.append(x)
            l3.append(y)
     
    print(l3)    
    [100102, 9, 100005, 5, 1060, 4, 1007, 3, 108, 8, 107, 7, 16, 6, 0, 10, 0, 2, 0, 1]
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    une solution similaire à celle de tyrtamos (juste une écriture différente en fait) :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import itertools
    l1 = [100009, 9, 100005, 5, 1004, 4, 1003, 3, 108, 8, 107, 7, 16, 6, 0, 10, 0, 2, 0, 1]
    l2 = [93, 9, 56, 4, 44, 3]
    a = zip(*[iter(l1)]*2)   # [(100009, 9), (100005, 5), (1004, 4), (1003, 3), (108, 8), (107, 7), (16, 6), (0, 10), (0, 2), (0, 1)]
    b = {j:i for i,j in zip(*[iter(l2)]*2)}   # {9: 93, 3: 44, 4: 56}
    c = map(lambda (x, y): (x, y) if y not in b.keys() else (x + b[y], y), a)
    l3 = list(itertools.chain.from_iterable(c))
    • on groupe l1 en une liste de valeurs appairées dans des tuples
    • par contre l2 j'en fait un dictionnaire qu'il est plus facile à le piocher dedans
    • le coeur de l'opération se situe autout du map (facile à comprendre à priori)
    • à la fin on flatten le résultat obtenu via itertools.chain.from_iterable() qui fait ça tout seul

  4. #4
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour
    D'abord mille mercis! je vais tester vos solutions : la première est plus claire pour moi, et je reste fasciné par votre capacité à décortiquer logiquement ce qui m'apparaissait si complexe.
    Eljoj

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Encore moi !

    Argggg!
    je reviens vers vous car j'ai une erreur "list index out of range" à la ligne 11 de la solution de Tyrtamos et qui doit être liée à ma liste 2.
    Je vais voir si la proposition de Bufferbob change quelque chose.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    La solution de Bufferbob ne renvoie aucune erreur et marche nickel, ce n'est donc peut-être pas juste une écriture différente?
    En tout cas encore merci de votre rapidité.

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Avec les valeurs données, ça ne donne aucune erreur chez moi (Python 3), mais effectivement, ce qui m'a déconcerté dans l'énoncé, c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    la seconde peut être de longueur variable
    l2=[93,9,56,4,44,3]
    Avec mon code, il peut y avoir des erreurs avec d'autres valeurs si cette liste l2 est trop courte.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par eljoj Voir le message
    La solution de Bufferbob ne renvoie aucune erreur et marche nickel, ce n'est donc peut-être pas juste une écriture différente?
    En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = map(lambda (x, y): (x, y) if y not in b.keys() else (x + b[y], y), a)
    la solution de Bufferbob s'occupe juste de trouver le "y" correspondant dans l2 sans tenir compte de leur ordre. Sinon, oui, si on doit gérer les différents cas de longueurs de l1 et l2, çà se complique un peu.

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

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    la solution de Bufferbob s'occupe juste de trouver le "y" correspondant dans l2 sans tenir compte de leur ordre. Sinon, oui, si on doit gérer les différents cas de longueurs de l1 et l2, çà se complique un peu.
    c'est ça. pour préciser un peu, on nous dit (dans le PO) que l1 contient 20 valeurs, donc on suppose que c'est fixe
    quant à l2 il est question d'"additionner la 1ere occurence, lorsque la 2eme est commune à l1 et l2, et en laissant à l'identique les éléments de l1 qui ne sont pas dans l2", ce qui revient à supposer que :
    • l2 contient toujours un nombre pair de valeurs
    • l'ordre de l2 importe peu (une fois les valeurs mises 2 par 2)
    • toutes les 2èmes valeurs (les valeurs d'index impair donc dans la liste) de l2 sont uniques dans la liste, ce qui incite à en faire un dictionnaire

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Moi, je ferai comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    l1=[100009,9, 100005,5, 1004,4, 1003,3, 108,8, 107,7, 16,6, 0,10, 0,2, 0,1]
     
    l2=[93, 9, 56, 4, 44, 3]
     
    result = l1[:]
     
    for i in range(1, len(l1), 2):
        try:
            result[i-1] += l2[l2[1:].index(l1[i])]
        except ValueError:
            pass
     
    print result
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    c'est ça. pour préciser un peu, on nous dit (dans le PO) que l1 contient 20 valeurs, donc on suppose que c'est fixe
    quant à l2 il est question d'"additionner la 1ere occurence, lorsque la 2eme est commune à l1 et l2, et en laissant à l'identique les éléments de l1 qui ne sont pas dans l2", ce qui revient à supposer que :
    • l2 contient toujours un nombre pair de valeurs
    • l'ordre de l2 importe peu (une fois les valeurs mises 2 par 2)
    • toutes les 2èmes valeurs (les valeurs d'index impair donc dans la liste) de l2 sont uniques dans la liste, ce qui incite à en faire un dictionnaire
    Lorsque l'énoncé d'un problème peut être interprété de différentes façons, c'est qu'il n'est pas si clair

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

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Lorsque l'énoncé d'un problème peut être interprété de différentes façons, c'est qu'il n'est pas si clair
    oui oui évidemment, si ce qui se conçoit bien s'énonce clairement on sent bien que la problématique dans le fond n'était pas tout à fait claire pour le PO, c'est d'ailleurs pour ça qu'"il est question (...) de supposer que" et non d'affirmer que l'énoncé était limpide

  13. #13
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonsoir
    Encore merci de vos contributions.
    J'ai envie de dire que si cela avait été clair pour moi, je n'aurais pas eu besoin de demander votre aide lol! C'est le problème quand on est débutant et il est clair que je ne sais pas correctement décrire les critères auxquels ma liste n°2 répond. Je me suis lancé dans un script qui dépasse largement mes connaissances, ce qui me permet d'aborder des fonctions inconnues de moi, de faire des tests, et par la pratique de comprendre des choses que la théorie ne m'explique pas. Au final il fonctionne...
    Ce qu'a proposé Bufferbob marche très bien et m'a permis d'avancer sur des éléments que je maîtrise mieux.
    Je marque donc le sujet comme résolu!
    Cordialement
    Eljoj

  14. #14
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 19
    Points : 10
    Points
    10
    Par défaut cette solution ne marche plus (python 2.7.14)
    Bonjour,
    Pardon de déterrer ce vieux sujet, mais la solution que m'avait proposé Bufferbob (et qui marchait à merveille) ne fonctionne plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import itertools
    l1 = [100009, 9, 100005, 5, 1004, 4, 1003, 3, 108, 8, 107, 7, 16, 6, 0, 10, 0, 2, 0, 1]
    l2 = [93, 9, 56, 4, 44, 3]
    a = zip(*[iter(l1)]*2)   # [(100009, 9), (100005, 5), (1004, 4), (1003, 3), (108, 8), (107, 7), (16, 6), (0, 10), (0, 2), (0, 1)]
    b = {j:i for i,j in zip(*[iter(l2)]*2)}   # {9: 93, 3: 44, 4: 56}
    c = map(lambda (x, y): (x, y) if y not in b.keys() else (x + b[y], y), a)
    l3 = list(itertools.chain.from_iterable(c))
    la liste c ne fait que renvoyer l1 au lieu de créer une 3eme liste c=[100102, 9, 100010, 5, etc...]
    Y a-t-il eu des changements avec itertools ou map?

    Merci de votre aide
    Eljoj

  15. #15
    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
    Chez moi ca fonctionne très bien ...

    c vaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [(100102, 9), (100005, 5), (1060, 4), (1047, 3), (108, 8), (107, 7), (16, 6), (0, 10), (0, 2), (0, 1)]
    et l3 vaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [100102, 9, 100005, 5, 1060, 4, 1047, 3, 108, 8, 107, 7, 16, 6, 0, 10, 0, 2, 0, 1]
    J'ai testé également avec un compilateur en ligne (https://repl.it/repls/SuburbanHalfRaven) et ça fonctionne tout aussi bien !

    T'es bien sur Python 2.7 toujours ? Sinon je ne vois pas

  16. #16
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    lg_53 : merci de ta réponse, qui m'a permis de chercher ailleurs mon erreur. Dans ma liste "l2" les couples de données arrivaient dans un ordre inverse! L'erreur étant corrigée, tout fonctionne!
    Je marque à nouveau ce sujet comme "résolu"!

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

Discussions similaires

  1. [XL-2010] Comparer deux bases de données pour en créer une troisième
    Par Xaphalys dans le forum Excel
    Réponses: 5
    Dernier message: 24/07/2014, 13h24
  2. [XL-2003] VBA EXCEL nettoyer une liste de noms pour en faire une base de données
    Par klhsri dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/03/2012, 13h21
  3. Réponses: 4
    Dernier message: 03/05/2007, 20h27
  4. Creer Bitmap pour en faire une texture sur OpenGL
    Par denebj dans le forum OpenGL
    Réponses: 2
    Dernier message: 16/03/2006, 11h07
  5. [C#] Concatener 2 variables pour en faire une 3ème
    Par Thomas Lebrun dans le forum Windows Forms
    Réponses: 6
    Dernier message: 11/05/2004, 21h02

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