def common_elements(list1, list2):
"""
Return a list containing the elements which are in both list1 and list2
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
"""
for element in list1:
if element in list2:
return list(element)
Habe das bisher, kann es aber nicht zum Laufen bringen!
Irgendwelche Ideen?
Antworten:
quelle
Sie können auch Mengen verwenden und die Gemeinsamkeiten in einer Zeile erhalten: Subtrahieren Sie die Menge, die die Unterschiede enthält, von einer der Mengen.
quelle
Die von S.Mark und SilentGhost vorgeschlagenen Lösungen zeigen Ihnen im Allgemeinen, wie es auf pythonische Weise gemacht werden sollte, aber ich dachte, Sie könnten auch davon profitieren, wenn Sie wissen, warum Ihre Lösung nicht funktioniert. Das Problem ist, dass Sie nur dieses einzelne Element zurückgeben, sobald Sie das erste gemeinsame Element in den beiden Listen finden. Ihre Lösung kann behoben werden, indem Sie eine
result
Liste erstellen und die allgemeinen Elemente in dieser Liste sammeln:Eine noch kürzere Version mit Listenverständnis:
Wie gesagt, dies ist jedoch eine sehr ineffiziente Methode. Die in Python integrierten Set-Typen sind weitaus effizienter, da sie intern in C implementiert sind.
quelle
benutze set intersections, set (list1) & set (list2)
Beachten Sie, dass die Ergebnisliste eine andere Reihenfolge als die ursprüngliche Liste haben kann.
quelle
Sie können ein einfaches Listenverständnis verwenden:
quelle
Set ist ein weiterer Weg, wie wir dies lösen können
quelle
list1 = [1,2,3,4,5,6] list2 = [3,5,7,9]
Ich weiß, dass 3 Wege dies lösen können. Natürlich könnte es mehr geben.
1-
2-
3-
Der dritte Weg ist der schnellste, da Sets mithilfe von Hash-Tabellen implementiert werden.
quelle
Die vorherigen Antworten arbeiten alle daran, die eindeutigen gemeinsamen Elemente zu finden, berücksichtigen jedoch nicht die wiederholten Elemente in den Listen. Wenn Sie möchten, dass die allgemeinen Elemente in derselben Nummer angezeigt werden, wie sie in den Listen gemeinsam aufgeführt sind, können Sie den folgenden Einzeiler verwenden:
Das
or True
Teil ist nur erforderlich, wenn Sie erwarten, dass Elemente ausgewertet werdenFalse
.quelle
set
die nicht stabil sind (auch bekannt als die Bestellung geht verloren).Ich verglich jede Methode, die in jeder Antwort erwähnt wurde. In diesem Moment verwende ich Python 3.6.3 für diese Implementierung. Dies ist der Code, den ich verwendet habe:
Wenn Sie diesen Code ausführen, können Sie sehen, dass Sie fast die gleiche Leistung erzielen, wenn Sie Liste oder Generator verwenden (wenn Sie über Generator iterieren und ihn nicht nur verwenden. Ich habe dies getan, als ich den Generator gezwungen habe, die Länge zu drucken). Wenn Sie jedoch set verwenden, erhalten Sie eine viel bessere Leistung. Auch wenn Sie die Schnittmethode verwenden, erhalten Sie eine etwas bessere Leistung. Das Ergebnis jeder Methode in meinem Computer ist unten aufgeführt:
quelle
Dies ist mein Vorschlag, ich denke, es ist einfacher mit Mengen als mit einer for-Schleife
quelle
Warum nicht verwenden
list comprehension
?Halblinienlösung:
quelle
1) Methode1, die Liste1 speichert, ist ein Wörterbuch und iteriert dann jedes Element in Liste2
Gemeinsame und unterschiedliche Elemente finden:
2) Methode2 mit set
quelle
Verwenden Sie einen Generator:
Der Vorteil hierbei ist, dass dies auch bei Verwendung großer Listen oder anderer großer Iterables in konstanter Zeit (fast augenblicklich) wiedergegeben wird.
Beispielsweise,
Alle anderen Antworten hier werden mit diesen Werten für Liste1 und Liste2 sehr lange dauern.
Sie können die Antwort dann mit wiederholen
Oder konvertieren Sie es in eine Liste mit
quelle
for i in common: print(i)
. Generatoren sind Iterables, die häufig anstelle anderer Iterables wie Listen verwendet werden.