Merge-Listen, die gemeinsame Elemente
Mein input ist eine Liste von Listen. Einige gemeinsame Elemente, wie zB.
L = [['a','b','c'],['b','d','e'],['k'],['o','p'],['e','f'],['p','a'],['d','g']]
Ich Zusammenführen müssen alle Listen, die ein gemeinsames element, und wiederholen Sie diesen Vorgang so lange, als es keine mehr Listen mit der gleichen Artikelnummer. Ich dachte über die Verwendung von booleschen Operationen und eine while-Schleife, konnte aber nicht kommen mit einer guten Lösung.
Das Endergebnis sollte sein:
L = [['a','b','c','d','e','f','g','o','p'],['k']]
Was meinst du mit verschmelzen? Union? Können Sie zeigen, welches Ergebnis erwarten Sie für Ihr Beispiel-Daten?
In Ihrem Beispiel, würden Sie stoppen Sie, wenn Sie auf
was ist mit der Liste
So oder so, der Komplexität werden am besten expotential (wahrscheinlich noch schlimmer). Wie wäre es mit sets statt, um zumindest die Prüfung für die gemeinsamen Elemente schnell?
Sie gehen durch die ganze Liste einmal Eintritt in alle Listen, die ein gemeinsames element (wenn bool(set(A) & Satz(B)) == True). Danach prüfen Sie wieder und wieder, so lange wie Sie können nicht an der restlichen Liste. Wenn es eine Liste mit keine gemeinsamen Elemente auf andere Listen, wir halten es, wie es ist.
In Ihrem Beispiel, würden Sie stoppen Sie, wenn Sie auf
[k]
? Oder gehen Sie über alle dein Listen?was ist mit der Liste
[[a, b, c], [b, d, e], [d, f, g]]
. Sollten alle sein verschmolzen sich zu einer Liste? die ersten und die letzten Listen nicht haben ein gemeinsames element.So oder so, der Komplexität werden am besten expotential (wahrscheinlich noch schlimmer). Wie wäre es mit sets statt, um zumindest die Prüfung für die gemeinsamen Elemente schnell?
Sie gehen durch die ganze Liste einmal Eintritt in alle Listen, die ein gemeinsames element (wenn bool(set(A) & Satz(B)) == True). Danach prüfen Sie wieder und wieder, so lange wie Sie können nicht an der restlichen Liste. Wenn es eine Liste mit keine gemeinsamen Elemente auf andere Listen, wir halten es, wie es ist.
InformationsquelleAutor Wistful Jesus | 2011-01-30
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Ihre Liste als notation für Graphen, dh
['a','b','c']
ist ein graph mit 3 Knoten miteinander verbunden. Das problem, das Sie versuchen zu lösen, ist die Suche nach angeschlossene Komponenten, die in diesem Diagramm.Können Sie NetworkX für diese, was den Vorteil hat, dass es ziemlich garantiert, um korrekt zu sein:
Lösen diese effizient selbst müssen Sie konvertieren die Liste in etwas Grafik-ish sowieso, so dass Sie könnte genauso gut verwenden die networkX von Anfang an.
Jesus: ein Grund mehr, die Bibliothek zu benutzen.
Coole Antwort. Als eine kleine Anregung, um es noch kürzer, die
to_edges
- Funktion ersetzt werden könnte, durchizip(part[:-1], part[1:])
.Was ist die Zeit-Komplexität von connect_components?
InformationsquelleAutor Jochen Ritzel
Algorithmus:
So möchten Sie vielleicht zu verwenden, setzt nicht auf "Liste". Das folgende Programm sollte es tun.
first, *rest = l
Konstrukt ist Python 3 nur, tauschen es mitfirst, rest = l[0], l[1:]
scheint gut zu funktionieren, auf python 2.7InformationsquelleAutor Howard
Stieß ich auf das gleiche Problem zu versuchen, zu verschmelzen-down-Listen mit gemeinsamen Werten. In diesem Beispiel kann das sein, was du suchst.
Es nur Schleifen über Listen einmal und updates resultset wie es geht.
#
dies ist inzwischen korrigiert worden
InformationsquelleAutor Nicholas Braaksma
Ich denke, dieses Problem kann gelöst werden durch die Modellierung des Problems als Grafik. Jede Teilliste ist ein Knoten und teilt eine Kante mit einem anderen Knoten nur, wenn die beiden Teillisten haben einige Elemente gemeinsam. So, eine zusammengeführte Teilliste ist im Grunde ein angeschlossene Komponente in der Grafik. Die Zusammenführung aller von Ihnen ist einfach eine Frage der Suche nach allen angeschlossenen Komponenten und listet Sie.
Kann dies durch eine simple traversal über dem Diagramm. Beide BFS und DFS verwendet werden kann, aber ich bin mit der DFS hier, da ist es etwas kürzer für mich.
Können Sie gemeinsam einen Fall gibt, für den dies nicht gelingt?
ah, es scheint, das problem existiert in Python 3.5, aber nicht 2.7...
Können Sie bitte teilen Sie ein Fall für die dies scheitert in Python 3.5?
Aktualisiert den code auf Python-3.5.
InformationsquelleAutor MAK
Als Jochen Ritzel darauf hingewiesen, Sie sind auf der Suche nach angeschlossenen Komponenten in einem Diagramm. Hier ist, wie könnte man es umsetzen ohne die Verwendung einer graph-Bibliothek:
InformationsquelleAutor pillmuncher
Mein Versuch. Hat funktionalen Charakter.
InformationsquelleAutor Rumple Stiltskin
Habe ich gefunden itertools eine schnelle option für das Zusammenführen von Listen und es löste dieses problem für mich:
Für große Gruppen Sortieren LL von der Frequenz aus den häufigsten Elementen der Beine kann die Dinge beschleunigen ein bisschen
InformationsquelleAutor mimomu
Habe ich benötigt, um führen Sie die clustering-Technik beschrieben, durch die OP, die millionenfach für sehr große Listen, und wollte daher, um zu bestimmen, welche der Methoden, die oben vorgeschlagen ist sowohl für höchst präzise und performantester.
Lief ich 10 versuche für die Eingabe von Listen der Größe von 2^1 bis 2^10 für jede Methode vor, mit der gleichen input-Liste für jede Methode, gemessen und die Durchschnittliche Laufzeit jedes Algorithmus vorgeschlagen, oben in Millisekunden. Hier sind die Ergebnisse:
Diese Ergebnisse halfen mir zu sehen, dass die Methoden, die konsequent die richtigen Ergebnisse zurück, @jochen das ist die Schnellste. Unter den Methoden, die nicht konsequent die richtigen Ergebnisse zurück, die mak-Lösung oft nicht enthalten sind alle Eingabe-Elemente (z.B. Liste der Mitglieder fehlen), und die Lösungen von braaksma, cmangla, und Sternchen nicht garantiert werden maximal zusammengeführt.
Es ist interessant, dass die zwei schnellsten, richtigen algorithmen haben die beiden top-Menge an upvotes zu Datum, und richtig Platz um.
Hier ist der code zum ausführen des tests:
Und zum Plotten:
InformationsquelleAutor duhaime
Dies ist eine ziemlich schnelle Lösung ohne Abhängigkeiten. Es funktioniert wie folgt:
Zuweisen einer eindeutigen Referenznummer für jede von Ihr lebt (in diesem Fall der erste index der Teilliste)
Erstellen ein Wörterbuch der Referenz-Elemente für jede Teilliste, und für jedes Element in jeder Teilliste.
Wiederholen Sie die folgenden Verfahren, bis es verursacht keine Veränderungen:
3a. Gehen Sie durch jedes Element in jeder Teilliste. Wenn das Element den aktuellen Referenz-Nummer unterscheidet sich von der Referenz-Anzahl der Unterliste, dann muss das element ein Teil der zwei Listen. Die Zusammenführung der beiden Listen (entfernen von der aktuellen Teilliste von der Referenz), und legen Sie die Referenz-Anzahl aller Elemente in der aktuellen Teilliste werden die Referenz-Nummer der neuen Teilliste.
Wenn diese Prozedur bewirkt, dass keine änderungen, es ist, weil alle Elemente sind Bestandteil genau einer Liste. Da working set ist eine Verringerung in der Größe bei jeder iteration der Algorithmus, der unbedingt beendet.
Hier sind eine Reihe von tests für diesen code:
Beachten Sie, dass der Rückgabewert ist eine Liste von Sätzen.
InformationsquelleAutor Zags
Ohne zu wissen durchaus, was Sie wollen, habe ich beschlossen, nur denke, Sie meinte: ich will den finden, der jedes element nur einmal.
Ausgabe sieht so aus:
.__class__ == list
sieht so unglaublich falsch. Zumindestisinstance(sub, list)
. Wenn auch nur als eine Sache des Prinzips. (Auch, man könnte/sollte nur einen Satz, statt ein dict mit falschen Werten.)schuldig in beiden Punkten zu 🙂
Auch k sollte nicht mit anderen Komponenten pro die OP ' s Frage
heh, das Bearbeiten, Hinzugefügt diese Anforderung wurde Hinzugefügt, nachdem ich gepostet meine Antwort. Es ist sehr lehrreich, dass anstelle der Beantwortung der Frage, die ich hätte Fragen sollen das Plakat zu schreiben, eine bessere Frage zuerst. Danke.
vielen Dank für zeigt mir den .__Klasse__ hack!
InformationsquelleAutor sarnold
Dies ist vielleicht eine einfachere/schnellere Algorithmus und scheint gut zu funktionieren -
InformationsquelleAutor cmangla
Vermisse ich nicht quirurgic version. Ich poste es auf 2018 (7 Jahre später)
Einer einfach und understable Ansatz:
1) Kartesisches Produkt ( cross join ) verschmelzen beide, wenn es gemeinsame Elemente
2) entfernen Sie dups
InformationsquelleAutor dani herrera
Können Sie networkx-Bibliothek, da ist ein Graphentheorie und angeschlossenen Komponenten problem:
Ausgabe:
InformationsquelleAutor Scott Boston