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 :

Trouver toutes les associations possibles entre les valeurs de deux listes [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Par défaut Trouver toutes les associations possibles entre les valeurs de deux listes
    Bonjour à tous,

    Je possède deux listes (représentant des origines et destinations) de même dimension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = ["A","B","C"]
    b = ["D","E","F"]
    Et j'aimerais lister toutes les combinaisons possibles deux à deux, telles que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = [["AD","BE","CF"], ["AD","BF","CE"], ["AE","BD","CF"], ["AE","BF","CD"], ["AF","BD","CF"], ["AF","BE","CE"]]
    Autre exemple (plus simple, pour comprendre la logique ciblée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = ["A","B"]
    b = ["C","D"]
    Ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = [["AC","BD"], ["AD","BC"]]
    Le nombre de combinaisons possibles pour des listes de 4 dimensions est 4x3x2x1 (24), de 3 dimensions est 3x2x1 (6), etc.

    J'ai fait plusieurs tests, mais je n'arrive pas à construire l'algorithme qui fonctionne quelque soit la dimension de mes deux listes et sans créer de redondance (["AC","BD"] et ["BD","AC"]).

    Je vous remercie par avance pour votre aide !

    Adrien

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    En supposant que les combinaisons soient déjà disponibles,
    tu peux traiter la liste de toutes les combinaisons possibles comme une matrice, et le résultat que tu désires serait juste les colonnes de ta matrice.

    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
    combinaisons = ['AD', 'AE', 'AF', 'BD', 'BE', 'BF', 'CD', 'CE', 'CF']
     
    SIZE = 3
     
    print (combinaisons)
     
    res = []
    for i in range(SIZE):
    	group = []
    	for j in range(SIZE):
    		group.append(combinaisons[j*SIZE+i])
    	res.append(group)
     
    print (res)
     
    ### output
    ['AD', 'AE', 'AF', 'BD', 'BE', 'BF', 'CD', 'CE', 'CF']
    [['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AF', 'BF', 'CF']]
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Par défaut
    Bonjour et merci pour ta réponse.

    Malheureusement, je crois que mon problème n'a pas été bien exposé car ta réponse ne correspond pas à mon besoin.

    Je dois associer une origine (A, B, C) à une destination (D, E, F) et lister toutes les combinaisons d'associations (6 pour deux listes de taille 3) :

    Combinaison n°1 : A relié à D, B relié à E et C relié à F
    Combinaison n°2 : A relié à D, B relié à F et C relié à E
    Combinaison n°3 : A relié à E, B relié à D et C relié à F
    Combinaison n°4 : A relié à E, B relié à F et C relié à D
    Combinaison n°5 : A relié à F, B relié à D et C relié à F
    Combinaison n°6 : A relié à F, B relié à E et C relié à E

    Pour info, connaître toutes les associations possibles n'est pas compliqué du tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    origines = ["A", "B", "C"]
    destinations = ["D", "E", "F"]
    associations = []
    for origine in origines:
        for destination in destinations:
            associations.append([origine, destination])
    print(associations)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [['A', 'D'], ['A', 'E'], ['A', 'F'], ['B', 'D'], ['B', 'E'], ['B', 'F'], ['C', 'D'], ['C', 'E'], ['C', 'F']]
    Dans notre cas, elles vont servir plusieurs fois (l'association B-F se retrouve par exemple dans les combinaisons n°2 et n°4).

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Pour obtenir les combinaisons précédentes, c'est assez facile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = ["A","B","C"]
    b = ["D","E","F"]
     
    c=[]
    for i in range(len(a)):
        for j in range(len(b)):
            c.append(a[i]+b[j])
     
    print(c)

  5. #5
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    J'ai regardé dans itertools, j'ai pas trouvé de fonction pouvant faire cela, mais product peut servir.

    Je ne sais pas si c'est exactement ce que tu voulais, mais d'parès ce que j'ai compris oui.

    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
    19
    20
    21
    22
    23
    24
    import itertools
    import re
     
    def association(liste1, liste2, combinaison) :
        resultat = set()
        for n in itertools.product(liste1, liste2, repeat=combinaison) :
            setn = set(n)
            if len(setn) == len(n) :
                liste = [v for v in re.split('(\w{2})', ''.join(n)) if v]
                resultat.add(tuple(sorted(liste)))
        return sorted(resultat)
     
    a = ["A","B"]
    b = ["C", "D"]
     
    # [('AC', 'BD'), ('AD', 'BC')]
    print(association(a, b, 2))
     
     
    a = ["A","B","C"]
    b = ["D","E","F"]
     
    # [('AD', 'BE', 'CF'), ('AD', 'BF', 'CE'), ('AE', 'BD', 'CF'), ('AE', 'BF', 'CD'), ('AF', 'BD', 'CE'), ('AF', 'BE', 'CD')]
    print(association(a, b, 3))

  6. #6
    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,

    en fait il se peut qu'on puisse décortiquer le problème différemment, finalement l'origine dont tu parles ne bouge pas, c'est toujours la même ['A', 'B', 'C'], et tu veux associer cette origine à chacune des permutations de l'ensemble ['D', 'E', 'F'] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> list(itertools.permutations(['D', 'E', 'F']))
    [('D', 'E', 'F'), ('D', 'F', 'E'), ('E', 'D', 'F'), ('E', 'F', 'D'), ('F', 'D', 'E'), ('F', 'E', 'D')]
    il restera simplement pour chaque triplet à l'associer avec l'origine, à coups de zip() par exemple et moyennant une fonction pour mettre le tout en forme

    à la dégueu et pour montrer que ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> f=lambda x: [''.join(x[i]) for i in range(len(x))]
    >>> [f(zip('ABC', j)) for j in [''.join(i) for i in list(itertools.permutations('DEF'))]]
    [['AD', 'BE', 'CF'], ['AD', 'BF', 'CE'], ['AE', 'BD', 'CF'], ['AE', 'BF', 'CD'], ['AF', 'BD', 'CE'], ['AF', 'BE', 'CD']]

  7. #7
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    En effet c'est beaucoup plus rapide eu niveau perfs.

    Faut par contre pas oublier de convertir en list.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> [f(list(zip('ABC', j))) for ...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/06/2015, 05h09
  2. Réponses: 4
    Dernier message: 12/08/2014, 14h07
  3. Stocker dans un tableau toutes les combinaisons possibles entre plusieurs tableaux.
    Par gui-yem dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 19/03/2014, 15h22
  4. Toutes les combinaison possibles entre les termes
    Par Wim88 dans le forum Général Java
    Réponses: 7
    Dernier message: 28/02/2014, 18h27
  5. Générer toutes les substitutions possibles entre deux listes
    Par AngryArtz dans le forum Général Java
    Réponses: 6
    Dernier message: 06/11/2011, 22h13

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