Wie verkette ich zwei Listen in Python?
Beispiel:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Erwartetes Ergebnis:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
Wie verkette ich zwei Listen in Python?
Beispiel:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Erwartetes Ergebnis:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
[1,2,5] and [2,4,5,6]
? Möchten Sie, dass die Duplikate eingeschlossen, ausgeschlossen oder egal sind?Antworten:
Sie können den
+
Operator verwenden, um sie zu kombinieren:Ausgabe:
quelle
listone += listtwo
Ergebnisse inlistone == [1, 2, 3, 4, 5, 6]
list3 = listone
listone+=listtwo
Wird list3 auch geändert?Es ist auch möglich, einen Generator zu erstellen, der einfach die Elemente in beiden Listen mit iteriert
itertools.chain()
. Auf diese Weise können Sie Listen (oder beliebige iterierbare) zur Verarbeitung miteinander verketten, ohne die Elemente in eine neue Liste zu kopieren:quelle
chain
ist für zwei Listen langsamer (aber nicht viel), aber die schnellste Lösung für die Verkettung mehrerer Listen (n >> 2).Python-
>= 3.5
Alternative:[*l1, *l2]
Eine andere Alternative wurde eingeführt, über deren Annahme
PEP 448
Erwähnung verdient.Das PEP mit dem Titel " Zusätzliche Entpackungsverallgemeinerungen" reduzierte im Allgemeinen einige syntaktische Einschränkungen, wenn der markierte
*
Ausdruck in Python verwendet wurde. Damit können Sie jetzt auch zwei Listen verbinden (gilt für alle iterierbaren) mit:Diese Funktionalität wurde für Python definiert
3.5
und nicht auf frühere Versionen der3.x
Familie zurückportiert . In nicht unterstützten VersionenSyntaxError
wird a ausgelöst.Wie bei den anderen Ansätzen wird auch hier eine flache Kopie der Elemente in den entsprechenden Listen erstellt.
Der Vorteil dieses Ansatzes ist, dass Sie wirklich keine Listen benötigen, um ihn auszuführen. Alles, was iterierbar ist, reicht aus. Wie im PEP angegeben:
Also, während Addition mit
+
eineTypeError
aufgrund von Typinkongruenz auslösen würde:Folgendes wird nicht:
weil es zuerst den Inhalt der iterables entpackt und dann einfach einen
list
aus dem Inhalt erstellt.quelle
res = [*l1, *reversed(l2)]
. Dareversed
gibt ein Iterator zurück,res = l1 + reversed(l2)
würde einen Fehler auslösen.Sie können Sets verwenden, um eine zusammengeführte Liste eindeutiger Werte zu erhalten
quelle
listone + [x for x in listtwo if x not in listone]
import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))
dies aus.Sie können die
list.extend()
Methode auch verwenden , umlist
am Ende eines anderen ein hinzuzufügen :Wenn Sie die ursprüngliche Liste beibehalten möchten, können Sie ein neues
list
Objekt undextend
beide Listen erstellen :quelle
Ab Version 3.7 sind dies die beliebtesten stdlib-Methoden zum Verketten von zwei (oder mehr) Listen in Python.
Performance
2-Listen-Verkettung 1
Es gibt keinen großen Unterschied zwischen diesen Methoden, aber das ist sinnvoll, da sie alle die gleiche Reihenfolge der Komplexität (linear) haben. Es gibt keinen besonderen Grund, einen anderen vorzuziehen, außer aus Gründen des Stils.
N-List-Verkettung
Mit dem Perfplot- Modul wurden Diagramme erstellt . Code als Referenz.
1. Die
iadd
(+=
) undextend
Methoden arbeiten an Ort und Stelle, daher muss jedes Mal vor dem Testen eine Kopie erstellt werden. Um die Dinge fair zu halten, haben alle Methoden einen Vorkopierschritt für die linke Liste, der ignoriert werden kann.Kommentare zu anderen Lösungen
VERWENDEN SIE DIE DUNDER-METHODE NICHT
list.__add__
direkt in irgendeiner Form. Halten Sie sich von Dunder-Methoden fern und verwenden Sie die Operatoren undoperator
Funktionen, für die sie entwickelt wurden. In Python ist eine sorgfältige Semantik enthalten, die komplizierter ist, als nur den Dunder direkt aufzurufen. Hier ist ein Beispiel . Also, um zusammenzufassen,a.__add__(b)
=> BAD;a + b
=> GUT.Einige Antworten hier bieten
reduce(operator.add, [a, b])
eine paarweise Verkettung - dies ist das Gleiche wiesum([a, b], [])
nur wortreicher.Bei jeder verwendeten Methode
set
werden Duplikate gelöscht und die Reihenfolge verloren. Mit Vorsicht verwenden.for i in b: a.append(i)
ist wortreicher und langsamer alsa.extend(b)
, was ein einzelner Funktionsaufruf und idiomatischer ist.append
ist aufgrund der Semantik, mit der Speicher für Listen zugewiesen und erweitert wird, langsamer. Siehe hier für eine ähnliche Diskussion.heapq.merge
wird funktionieren, aber sein Anwendungsfall ist das Zusammenführen sortierter Listen in linearer Zeit. Die Verwendung in jeder anderen Situation ist ein Anti-Muster.yield
Das Auflisten von Listenelementen aus einer Funktion ist eine akzeptable Methode, dieschain
geschieht jedoch schneller und besser (es hat einen Codepfad in C, ist also schnell).operator.add(a, b)
ist ein akzeptables funktionales Äquivalent zua + b
. Die Anwendungsfälle betreffen hauptsächlich den Versand dynamischer Methoden. Ansonsten lieber,a + b
was meiner Meinung nach kürzer und lesbarer ist . YMMV.quelle
"There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
"Lösungen, die nicht in meiner Antwort aufgeführt oder in" Kommentare "kritisiert sind. Ich empfehle, sie nicht zu verwenden.Das ist ganz einfach und ich denke, es wurde sogar im Tutorial gezeigt :
quelle
Bei dieser Frage geht es direkt darum, zwei Listen zu verbinden. Die Suche ist jedoch ziemlich hoch, selbst wenn Sie nach einer Möglichkeit suchen, viele Listen zu verbinden (einschließlich des Falls, wenn Sie Nulllisten verbinden).
Ich denke, die beste Option ist die Verwendung von Listenverständnissen:
Sie können auch Generatoren erstellen:
Alte Antwort
Betrachten Sie diesen allgemeineren Ansatz:
Wird ausgegeben:
Beachten Sie , dass dies auch richtig funktioniert , wenn
a
ist[]
oder[[1,2,3]]
.Dies kann jedoch effizienter durchgeführt werden mit
itertools
:Wenn Sie kein
list
, sondern nur ein iterierbares Element benötigen , lassen Sie es weglist()
.Aktualisieren
Die von Patrick Collins in den Kommentaren vorgeschlagene Alternative könnte auch für Sie funktionieren:
quelle
reduce
ist jetzt in,functools
daher müssen Sie es zuerst importieren.Sie können den Operator
+
oder einfach+=
wie folgt verwenden:Oder:
Wenn Sie möchten, dass die Werte in der zusammengeführten Liste eindeutig sind, können Sie Folgendes tun:
quelle
list(dict.fromkeys(a + b))
Es ist erwähnenswert, dass die
itertools.chain
Funktion eine variable Anzahl von Argumenten akzeptiert:Wenn eine iterable (Tupel, Liste, Generator usw.) die Eingabe ist, kann die
from_iterable
Klassenmethode verwendet werden:quelle
Mit Python 3.3+ können Sie die Ausbeute verwenden von :
Oder wenn Sie eine beliebige Anzahl von Iteratoren unterstützen möchten:
quelle
itertools.chain
(was äquivalent ist) verwenden, anstatt Ihre eigene Funktion zu definieren.Wenn Sie die beiden Listen in sortierter Form zusammenführen möchten, können Sie die
merge
Funktion aus derheapq
Bibliothek verwenden.quelle
Wenn Sie den Plus-Operator (
+
) nicht verwenden können , können Sie denoperator
Import verwenden:Alternativ können Sie auch die
__add__
Dunder- Funktion verwenden:quelle
+
es vom Tisch ist, verwenden Sieoperator.add
.Als allgemeinere Methode für mehr Listen können Sie sie in eine Liste einfügen und die Funktion
itertools.chain.from_iterable()
1 verwenden, die auf der Grundlage dieser Antwort die beste Methode zum Abflachen einer verschachtelten Liste darstellt:1. Beachten Sie, dass dies
chain.from_iterable()
in Python 2.6 und höher verfügbar ist. In anderen Versionen verwendenchain(*l)
.quelle
Wenn Sie zwei geordnete Listen mit komplizierten Sortierregeln zusammenführen müssen, müssen Sie sie möglicherweise selbst wie im folgenden Code rollen (unter Verwendung einer einfachen Sortierregel zur besseren Lesbarkeit :-)).
quelle
heapq.merge
.Sie können die
append()
fürlist
Objekte definierte Methode verwenden :quelle
Der obige Code behält die Reihenfolge nicht bei und entfernt Duplikate aus jeder Liste (jedoch nicht aus der verketteten Liste).
quelle
Wie bereits von vielen betont,
itertools.chain()
ist dies der richtige Weg, wenn auf beide Listen genau die gleiche Behandlung angewendet werden muss. In meinem Fall hatte ich ein Etikett und eine Flagge, die sich von einer Liste zur anderen unterschieden, also brauchte ich etwas etwas komplexeres. Wie sich herausstellt,itertools.chain()
geschieht hinter den Kulissen einfach Folgendes:(siehe https://docs.python.org/2/library/itertools.html ), also habe ich mich von hier inspirieren lassen und etwas in diese Richtung geschrieben:
Die wichtigsten Punkte, die hier zu verstehen sind, sind, dass Listen nur ein Sonderfall von iterable sind, bei denen es sich um Objekte wie jedes andere handelt. und dass
for ... in
Schleifen in Python mit Tupelvariablen arbeiten können, so dass es einfach ist, mehrere Variablen gleichzeitig zu durchlaufen.quelle
Verwenden Sie ein einfaches Listenverständnis:
Es bietet alle Vorteile des neuesten Ansatzes der Verwendung zusätzlicher Generalisierungen zum Entpacken - dh Sie können auf diese Weise eine beliebige Anzahl verschiedener Iterables (z. B. Listen, Tupel, Bereiche und Generatoren) verketten - und ist nicht auf Python 3.5 oder höher beschränkt .
quelle
Eine wirklich präzise Möglichkeit, eine Liste von Listen zu kombinieren, ist
was uns gibt
quelle
list.__add__
,operator.add
sondern verwenden. Dies ist das wortreichere Äquivalent,sum(list_of_lists, [])
das genauso schlecht ist. VERWENDE NICHT!obj.__class__
undobj.__dict__
.In Python können Sie mit diesem Befehl zwei Arrays kompatibler Dimensionen verketten
quelle
Es gibt also zwei einfache Möglichkeiten.
+
: Es wird eine neue Liste aus den bereitgestellten Listen erstelltBeispiel:
Beispiel:
Wir sehen also, dass von zwei der beliebtesten Methoden
extend
effizient ist.quelle
chain.from_iterable
).Es gibt mehrere Möglichkeiten, Listen in Python zu verketten.
quelle
Ausgabe:
quelle
Wenn Sie eine neue Liste wünschen, während Sie die beiden alten Listen beibehalten:
quelle
quelle
Sie können dem Code folgen
quelle