Was wäre Ihr Schnittpunkt für c1 schneiden c2? Möchten Sie einfach herausfinden, ob c1 in c2 ist? Oder möchten Sie alle Elemente in c1 finden, die irgendwo in c2 vorkommen?
c3 = [filter(lambda x: x in c1, sublist) for sublist in c2]
Bei Python3 filter gibt statt ein Iterable zurück listalso müssen Sie wickeln filter telefoniert mit list():
c3 = [list(filter(lambda x: x in c1, sublist)) for sublist in c2]
Erläuterung:
Der Filterteil nimmt das Element jeder Unterliste und prüft, ob es sich in der Quellenliste c1 befindet. Das Listenverständnis wird für jede Unterliste in c2 ausgeführt.
Sie können verwenden filter(set(c1).__contains__, sublist) für Effizienz. Übrigens, der Vorteil dieser Lösung ist, dass filter() behält Zeichenfolgen- und Tupeltypen bei.
– jfs
14. März 2009 um 10:46 Uhr
Ich mag diese Methode, aber ich bekomme ein leeres ” in meiner Ergebnisliste
– Jonathan Ong
7. Dezember 2011 um 21:35 Uhr
Ich habe hier Python 3-Kompatibilität hinzugefügt, da ich dies als Dupe-Ziel für eine Dupe einer Python 3-Frage verwende
– Antti Haapala – Слава Україні
29. Mai 2016 um 5:01 Uhr
Dies liest sich besser IMO mit verschachtelten Verständnissen: c3 = [[x for x in sublist if x in c1] for sublist in c2]
– Erich
20. August 2016 um 19:06 Uhr
Für Leute, die nur den Schnittpunkt zweier Listen finden möchten, bietet der Asker zwei Methoden:
b1 = [1,2,3,4,5,9,11,15]
b2 = [4,5,6,7,8]
b3 = [val for val in b1 if val in b2]
Aber es gibt eine hybride Methode, die effizienter ist, weil Sie nur eine Umwandlung zwischen list/set machen müssen, im Gegensatz zu drei:
b1 = [1,2,3,4,5]
b2 = [3,4,5,6]
s2 = set(b2)
b3 = [val for val in b1 if val in s2]
Dies wird in O (n) ausgeführt, während seine ursprüngliche Methode, die das Listenverständnis beinhaltet, in O (n ^ 2) ausgeführt wird.
Da “if val in s2” in O(N) läuft, ist die vorgeschlagene Code-Snippet-Komplexität ebenfalls O(n^2)
– Einhorn
21. März 2013 um 7:42 Uhr
Der durchschnittliche Fall von „val in s2“ ist O(1) gemäß wiki.python.org/moin/TimeComplexity#set – also über n Operationen ist die erwartete Zeit O(n) (ob die Worst-Case-Zeit O(n) oder O(n^2) ist, hängt davon ab, ob dieser Durchschnittsfall eine amortisierte Zeit darstellt oder nicht, aber das ist es nicht in der Praxis sehr wichtig).
– Chiara Coetzee
1. November 2013 um 23:20 Uhr
Die Laufzeit ist O (N), nicht weil sie amortisiert wird, sondern weil die Satzmitgliedschaft im Durchschnitt O (1) ist (z. B. bei Verwendung einer Hash-Tabelle), ist dies ein großer Unterschied, z. B. weil die amortisierte Zeit garantiert ist.
Was wäre Ihr Schnittpunkt für c1 schneiden c2? Möchten Sie einfach herausfinden, ob c1 in c2 ist? Oder möchten Sie alle Elemente in c1 finden, die irgendwo in c2 vorkommen?
– Brian R. Bondy
13. März 2009 um 13:59 Uhr
Lesen Dies und im Dolmetscher spielen.
– Pithikos
20. Januar 2015 um 10:40 Uhr