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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    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]

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    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 averti
    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
    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 averti
    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
    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 averti
    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
    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é.

+ 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