Wie finde ich eine Schnittmenge?
a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c
aktuelle Ausgabe: [1,3,5,6]
erwartete Ausgabe: [1,3,5]
Wie erreichen wir eine Boolesche AND-operation (Liste Kreuzung) auf zwei Listen?
InformationsquelleAutor der Frage csguy11 | 2010-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Reihenfolge nicht wichtig ist und Sie brauchen nicht zu befürchten, Duplikate können Sie dann festlegen, Kreuzung:
InformationsquelleAutor der Antwort Mark Byers
Wenn Sie konvertieren die größere der beiden Listen in einem set, bekommen Sie die Schnittpunkte der Satz mit jedem iterierbar mit
intersection()
:InformationsquelleAutor der Antwort Brian R. Bondy
Machen Sie einen Satz aus der größeren:
Dann,
wird tun, was Sie wollen (die Erhaltung
b
's bestellen, nichta
's-nicht unbedingt bewahren beide) und tun es schnell. (Mitif x in a
wie die Bedingung in der Liste Verständnis auch funktionieren würde, und vermeiden die Notwendigkeit zum Aufbau_auxset
aber leider nicht für Listen von erheblicher Länge, es wäre viel langsamer).Wenn Sie möchten, dass das Ergebnis sortiert werden, anstatt erhalten eine Liste der Bestellung, ein noch ordentlicher Weg sein könnte:
InformationsquelleAutor der Antwort Alex Martelli
Liste Verstehens ist ein ziemlich offensichtlich für mich. Nicht sicher über die Leistung, aber zumindest Dinge bleiben Listen.
[x for x in a if x in b]
Oder "alle x-Werte, die in A, wenn der X-Wert ist in B".
InformationsquelleAutor der Antwort Lodewijk
Hier einige Python-2 /Python-3-code, der erzeugt timing-Informationen für die Liste-basierend und set-basierten Methoden für die Suche nach der Schnittmenge aus zwei Listen.
Die Reine Liste Verständnis algorithmen sind O(n^2), da
in
auf eine Liste ist eine lineare Suche. Die set-basierte algorithmen sind O(n), da setzen die Suche ist O(1), und legen Sie die Schöpfung ist O(n) (und Konvertierung einer Reihe auf eine Liste, ist auch O(n)). Also für hinreichend große n set-basierte algorithmen sind schneller, aber für kleine n die Gemeinkosten für die Erstellung der set(s) machen Sie langsamer als die Reine Liste comp algorithmen.Ausgabe
Generiert mit einem 2-GHz-single-core-Rechner mit 2GB RAM läuft Python 2.6.6 auf eine Debian-Geschmacksrichtung von Linux (mit Firefox im hintergrund laufen).
Diese zahlen sind nur ein grober Richtwert, da die tatsächliche Geschwindigkeit der verschiedenen algorithmen sind unterschiedlich betroffen durch den Anteil der Elemente in der Quell-Listen.
InformationsquelleAutor der Antwort PM 2Ring
a = [1,2,3,4,5]
b = [1,3,5,6]
c = list(set(a).intersection(set b)))
Funktioniert wie ein Traum. Und, wenn Sie können, verwenden Sie legt, statt Listen zu vermeiden, diese Art ändern!
InformationsquelleAutor der Antwort Alex Hart
Wenn, die durch Boolesche AND, Sie bedeuten die Elemente angezeigt, die in beiden Listen, z.B. Kreuzung, dann sollten Sie sich im Python -
set
undfrozenset
Arten.InformationsquelleAutor der Antwort Tim McNamara
Einer funktionellen Art und Weise erreicht werden kann, mit
filter
undlambda
Betreiber.Edit: Es filtert x, existiert in beiden list1 Liste und legen Unterschied kann auch erreicht werden durch:
InformationsquelleAutor der Antwort Saftophobia