Comment identifier des communs entre plusieurs lignes

- - Dernière réponse :  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
Afficher la suite 

1 réponse

0
Merci
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 ?
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
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.
Super merci je vais déjà tester ça. Pas avant mardi du coup.
Super merci je vais déjà tester ça. Pas avant mardi du coup
Commenter la réponse de khrug