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]

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?

  • Integrationsproblem mit PyObjC und TKinter
  • Suds über https mit cert
  • Wiederholen einer Zeitreihe von Ereignissen + Dauer in gleichzeitige Ereignisse
  • Scikit-Learn: Fehler beim Anpassen des Modells - Input enthält NaN, Unendlichkeit oder einen zu großen Wert für float64
  • Unterschiede zwischen Klassenblock und Funktionsblock in Python
  • Was sind Python-Wörterbuch-View-Objekte?
  • So aktualisieren Sie die XML-Datei mit lxml
  • Schlüsselfehler & Pandas
  • 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.