3238 Stimmen

Wie kann ich zwei Listen in Python miteinander verknüpfen?

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]

5497voto

Daniel G Punkte 62538

Sie können die + Operator, um sie zu kombinieren:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

joinedlist = listone + listtwo

Ausgabe:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

657voto

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.

406voto

Robert Rossney Punkte 91100

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

365voto

cs95 Punkte 325143

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.

enter image description here

Fußnoten

  1. 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.

  2. Siehe chain und chain.from_iterable aus den Unterlagen. Sie müssen import 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.

  3. 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.

  4. a += b et a.extend(b) sind für alle praktischen Zwecke mehr oder weniger gleichwertig. += wenn es auf einer Liste aufgerufen wird, ruft intern list.__iadd__ , die die erste Liste um die zweite erweitert.


Leistung

2-Listen-Verkettung 1

enter image description here

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

enter image description here

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.


Kommentare zu anderen Lösungen

  • 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.

312voto

Gourneau Punkte 12240

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.com

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.

Powered by:

X