Comment identifier des communs entre plusieurs lignes

Fermé
Oro - 31 oct. 2019 à 17:15
 Oro - 31 oct. 2019 à 20:44
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

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