Comment identifier des communs entre plusieurs lignes

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. 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. 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
    2. @OroIl 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
    3. Super merci je vais déjà tester ça. Pas avant mardi du coup.
      0
    4. Super merci je vais déjà tester ça. Pas avant mardi du coup
      0