Comment identifier des communs entre plusieurs lignes

Oro -  
 Oro -
Bonjour,

Voici ma table en entrée :
["1003","2001","2002"]
["1001","2001"]
["3000","6000"]
["5000","3000"]

J'aimerais reunir toutes les lignes ou il y a un identifiant commun et avoir en sortie :

["1003","2001","2002","1001"]
[["3000","6000","5000"]

Avez vous des idées ?

Merci

1 réponse

  1. khrug
     
    Bonjour,

    Elles ont toutes un point commun, le 0.
    Problème résolu.

    Faudrait en dire plus sur ce que tu veux obtenir, pour ma part je n'arrive pas à saisir ce qui doit faire passer de ta liste1 à ta liste2.

    Parce que si faut exclure le 0 des points communs, alors pourquoi 3000, 6000 et 5000 doivent se retrouver ensemble ?
    0
    1. Oro
       
      Salut Khrug,

      ce qui est commun entre ligne 1 et ligne 2 c'est l"identifiant : 2001.
      Donc je considère que les individus dans la ligne et la ligne 2 appartiennent au même ensemble. Et j'aimerais justement regrouper les id de cet ensemble sur la même ligne
      0
      1. khrug > Oro
         
        Il va falloir soit une boucle infinie, soit une fonction récursive pour regrouper les lignes jusqu'à ne plus pouvoir le faire.
        Car imagine que si par exemple on ajooute à ta liste ["3000", "2001", "4005"], et que l'on fasse des ensembles dans l'ordre de la liste, on obtiendrait :

        ["1003","2001","2002","1001"]
        [["3000","6000","5000", "2001", "4005"]


        Alors que tout devrait être groupé.

        Donc il faut refaire des passages jusqu'il ne soit plus possible de grouper des lignes.

        Puis comme tu parles d'ensembles, en python il y a les sets qui vont faciliter un peu les opérations de comparaisons.

        Une première approche serait de faire une fonction du style.

        def lines_group(table):
            # Transformation des lignes de la table en set
            groups = [set(l) for l in table]
            while True:
                # Parcours des lignes des groupes sauf la dernière
                for i, group in enumerate(groups[:-1]):
                    # Parcours des lignes suivant la ligne courante
                    for group2 in groups[i+1:]:
                        # Si point commun entre les 2
                        if group & group2:
                            # Ajout au group courant, celui qui suit
                            group |= group2
                            # suppression du group2 des groupes
                            groups.remove(group2)
                            # Interruption pour recommencer le tout
                            break
                    else:
                        continue
                    break
                else:
                    # Si pas de break dans le for, break du while
                    break
            # Trnasformation des sets en listes
            return [list(g) for g in groups]
        
        table = [
            ["1003","2001","2002"],
            ["1001","2001"],
            ["3000","6000"],
            ["5000","3000"],
        ]
        
        print(lines_group(table))


        J'ai pas testé plus que ça, à voir si ça groupe bien toutes tes lignes.
        0
    2. Oro
       
      Super merci je vais déjà tester ça. Pas avant mardi du coup.
      0
    3. Oro
       
      Super merci je vais déjà tester ça. Pas avant mardi du coup
      0