Python über die Verknüpfung der Unterliste mit derselben Nummer zusammen

Ich muss Sublisten mit den gleichen Elementen zusammen gruppieren Beispiel:

list1 =[[1, 0], [2, 1], [30, 32]] 

Verknüpfen [1, 0] und [2, 1] zusammen, da sie beide 1 enthalten und diese zwei in [0, 1, 2]

  • Python: Übergeben von mehreren LARGE Sequenzen durch hmmlearn
  • Hashing Ausdrücke in Z3Python
  • Spezifische dynamisch verschachtelte Wörterbücher, Autovivifizierung Umsetzung
  • Die Methode des Elternteils, die vom Elternteil überschrieben wurde, aufrufen
  • Wie finde ich die Standardwerte eines Arguments einer bestimmten Funktion in einer anderen Funktion in Python?
  • Wie man externe CSS, Bild, etc in django Vorlage?
  • Nach der Verknüpfung sollte die neue Liste wie folgt sein:

     new_list1 = [[1, 0, 2], [30, 32]] 

    IE: Es sollte nicht die gleiche Nummer innerhalb einer Unterliste und Ordnung ist nicht wichtig.

    Ein längeres Beispiel:

     list2 = [[2, 3], [4, 3], [6, 5], [7, 6], [7, 8], [13, 14], [30, 32]] 

    Nach der Verknüpfung wäre es

     new_list2 = [[2, 3, 4], [6, 5, 7, 8], [13, 14], [30, 32]] 

    Also, wie kann das auf eine allgemeine Weise geschehen?

    2 Solutions collect form web for “Python über die Verknüpfung der Unterliste mit derselben Nummer zusammen”

    Um die Sublisten allgemein zu gruppieren, können Sie:

    Code:

     def linking_sublists(lists): index = {} sets = [] for l in lists: found = None for i in l: if i in index: # this list has an element we have already seen if found: # combine two sets to_remove = index[i] if found != to_remove: for j in index[i]: found.add(j) index[j] = found to_remove.clear() else: found = index[i] if found is not None: s = found for i in l: s.add(i) else: s = set(l) sets.append(s) for i in l: index[i] = s return [list(sorted(s)) for s in sets if s] 

    Wie:

    Diese Funktion verwendet Sätze und einen Index dict , um eine beliebige Liste mit passenden Elementen in Sätze zu gruppieren und zu verfolgen, welche Elemente bereits in einem set .

    Testcode:

     list_2 = [[2, 3], [4, 3], [6, 5], [7, 6], [7, 8], [13, 14], [30, 32]] print(linking_sublists(list_2)) list_3 = [[2, 3], [4, 3], [6, 5], [7, 6], [7, 8], [30, 32], [4, 5], [3, 4]] print(linking_sublists(list_3)) 

    Ergebnisse:

     [[2, 3, 4], [5, 6, 7, 8], [13, 14], [30, 32]] [[2, 3, 4, 5, 6, 7, 8], [30, 32]] 

    Eine Möglichkeit, dieses Problem zu sehen, ist, jede Unterliste als Knoten in einer Grafik zu denken. Zwei Knoten teilen sich eine Kante, wenn sie gemeinsame Elemente haben.

    Die Inseln ( "verbundene Komponenten" oder nur "Komponenten" ) des Graphen können dann verwendet werden, um die neuen Listen zu konstruieren. Der Graph für list2 würde so aussehen:

     [2,3]<--->[4,3] [6,5]<--->[7,6]<--->[7,8] [13,14] [30,32] 

    Code Skizze (ungetestet):

     list2=[[2,3],[4,3],[6,5],[7,6],[7,8],[13,14],[30,32]] # Convert to tuples for easier handling l2 = [tuple(item) for item in list2] # Build a graph graph = {item: set() for item in l2} for sublist in l2: for sublist2 in l2: if sublist == sublist2: continue for item in sublist: if item in sublist2: graph[sublist].add(sublist2) # Find all nodes that start_node is connected to def island(graph, start_node): visited = set() visited.add(start_node) frontier = set(graph[start_node]) while frontier: node = frontier.pop() visited.add(node) frontier.update(n for n in graph[node] if n not in visited) return visited # Find all islands islands = [] for sublist in l2: i = island(graph, sublist) if i not in islands: islands.append(i) # Build the new lists by getting all unique numbers from each island [list(set(item for sublist in island for item in sublist)) for island in islands] # Output: # [[2, 3, 4], [8, 5, 6, 7], [13, 14], [32, 30]] 

    Das oben genannte kann verbessert werden, sowohl die Art und Weise, wie die Grafik gebaut wird und wie die Komponenten gefunden werden, kann effizienter gemacht werden.

    Diese Art von Denken kann verwendet werden, um viele verschiedene Probleme zu lösen. Das heißt, ich mag Stephen Rauch's Lösung mehr wegen seiner Einfachheit.

    Python ist die beste Programmiersprache der Welt.