Wie kann ich zwei Listen in Python miteinander verknüpfen?
Beispiel:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Erwartetes Ergebnis:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
Wie kann ich zwei Listen in Python miteinander verknüpfen?
Beispiel:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Erwartetes Ergebnis:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
Python >= 3.5
alternativ: [*l1, *l2]
Eine weitere Alternative wurde durch die Annahme von PEP 448
die zu erwähnen ist.
Das PEP mit dem Titel Zusätzliche Verallgemeinerungen zum Auspacken einige syntaktische Einschränkungen bei der Verwendung des Sternchens *
Ausdruck in Python; damit kann nun auch das Verbinden zweier Listen (gilt für jede Iterable) durchgeführt werden:
>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> joined_list = [*l1, *l2] # unpack both iterables in a list literal
>>> print(joined_list)
[1, 2, 3, 4, 5, 6]
Diese Funktionalität wurde für Python definiert 3.5
nicht in frühere Versionen der Software zurückportiert wurde 3.x
Familie. In nicht unterstützten Versionen wird ein SyntaxError
wird angehoben werden.
Wie bei den anderen Ansätzen gilt auch hier erstellt als oberflächliche Kopie der Elemente in den entsprechenden Listen.
Le site oben Der Vorteil dieses Ansatzes besteht darin, dass man keine Listen braucht, um ihn auszuführen, sondern alles, was iterierbar ist, genügt. Wie im PEP angegeben:
Dies ist auch nützlich als eine lesbarere Art und Weise der Summierung von iterables in eine Liste, wie zum Beispiel
my_list + list(my_tuple) + list(my_range)
die jetzt äquivalent zu nur[*my_list, *my_tuple, *my_range]
.
Während also die Addition mit +
würde eine TypeError
aufgrund von Typinkongruenz:
l = [1, 2, 3]
r = range(4, 7)
res = l + r
Die folgenden werden es nicht:
res = [*l, *r]
weil es zuerst den Inhalt der Iterablen entpackt und dann einfach eine list
aus den Inhalten.
Es ist auch möglich, einen Generator zu erstellen, der einfach über die Elemente in beiden Listen iteriert, indem er itertools.chain()
. Auf diese Weise können Sie Listen (oder beliebige iterable) zur Verarbeitung miteinander verketten, ohne die Elemente in eine neue Liste zu kopieren:
import itertools
for item in itertools.chain(listone, listtwo):
# Do something with each list item
Wie kann ich zwei Listen in Python miteinander verknüpfen?
Ab 3.9 sind dies die gängigsten stdlib-Methoden zur Verkettung zweier (oder mehrerer) Listen in Python.
Fußnoten
Dies ist eine elegante Lösung, weil sie so knapp gehalten ist. Aber
sum
führt die Verkettung paarweise durch, was bedeutet, dass es sich um eine quadratischer Vorgang, da für jeden Schritt Speicher zugewiesen werden muss. DO NICHT VERWENDEN, wenn Ihre Listen groß sind.Siehe
chain
undchain.from_iterable
aus den Unterlagen. Sie müssenimport itertools
zuerst. Die Verkettung ist linear im Speicher, daher ist dies die beste Lösung in Bezug auf Leistung und Versionskompatibilität.chain.from_iterable
wurde in 2.6 eingeführt.Diese Methode verwendet Zusätzliche Verallgemeinerungen zum Auspacken (PEP 448) kann aber nicht auf N Listen verallgemeinern, es sei denn, Sie packen jede einzelne manuell aus.
a += b
eta.extend(b)
sind für alle praktischen Zwecke mehr oder weniger gleichwertig.+=
wenn es auf einer Liste aufgerufen wird, ruft internlist.__iadd__
, die die erste Liste um die zweite erweitert.
2-Listen-Verkettung 1
Zwischen diesen Methoden gibt es keine großen Unterschiede, aber das macht Sinn, da sie alle die gleiche Komplexitätsordnung haben (linear). Es gibt keinen besonderen Grund, die eine der anderen vorzuziehen, es sei denn, es ist eine Frage des Stils.
N-Listen-Verkettung
Die Diagramme wurden unter Verwendung der Perfplot Modul. Code, zu Ihrer Information.
1. Die <code>iadd</code> ( <code>+=</code> ) et <code>extend</code> Methoden arbeiten an Ort und Stelle, so dass vor dem Testen jedes Mal eine Kopie erstellt werden muss. Um die Dinge fair zu halten, haben alle Methoden einen Vorkopierschritt für die linke Liste, der ignoriert werden kann.
VERWENDEN SIE NICHT DIE DUNDER-METHODE list.__add__
direkt in irgendeiner Form. Halten Sie sich von Dunder-Methoden fern und verwenden Sie die Operatoren und operator
Funktionen, für die sie entwickelt wurden. Python hat eine sorgfältige Semantik in diese Funktionen eingebaut, die komplizierter ist als der direkte Aufruf des Dunder. Hier ist ein Beispiel . Um es zusammenzufassen, a.__add__(b)
=> SCHLECHT; a + b
=> GUT.
Einige Antworten hier bieten reduce(operator.add, [a, b])
für die paarweise Verkettung -- dies ist dasselbe wie sum([a, b], [])
nur noch wortreicher.
Jede Methode, die set
lässt Duplikate fallen und verliert die Ordnung. Seien Sie vorsichtig.
for i in b: a.append(i)
ist wortreicher und langsamer als a.extend(b)
, was einen einzigen Funktionsaufruf darstellt und idiomatischer ist. append
ist aufgrund der Semantik, mit der Speicher für Listen zugewiesen und erweitert wird, langsamer. Siehe aquí für eine ähnliche Diskussion.
heapq.merge
funktioniert, aber sein Anwendungsfall ist das Zusammenführen von sortierten Listen in linearer Zeit. Die Verwendung in jeder anderen Situation ist ein Anti-Muster.
yield
von Listenelementen aus einer Funktion ist eine akzeptable Methode, aber chain
erledigt dies schneller und besser (es hat einen Codepfad in C, ist also schnell).
operator.add(a, b)
ist ein akzeptables funktionales Äquivalent zu a + b
. Die Anwendungsfälle sind hauptsächlich für die dynamische Methodenabwicklung. Ansonsten bevorzugen Sie a + b
die kürzer und besser lesbar ist, meiner Meinung nach . YMMV.
Sie können auch die list.extend()
Methode, um eine list
bis zum Ende eines anderen:
listone = [1,2,3]
listtwo = [4,5,6]
listone.extend(listtwo)
Wenn Sie die ursprüngliche Liste beibehalten wollen, können Sie eine neue list
Objekt, und extend
beide Listen dazu:
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.