it-swarm.com.de

Wie kann ich die Verkettung von zwei Listen in Python erreichen, ohne eine zu ändern?

In Python kann ich zwei Listen nur mit list.extend verknüpfen, wodurch die erste Liste geändert wird. Gibt es eine Verkettungsfunktion, die das Ergebnis zurückgibt, ohne die Argumente zu ändern?

621
Ryan Thompson

Ja: list1+list2. Dies gibt eine neue Liste, die die Verkettung von list1 und list2 ist.

1058
NPE

Abhängig davon, wie Sie es verwenden werden, sobald es erstellt wurde itertools.chain ist möglicherweise die beste Wahl:

_>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)
_

Dadurch wird ein Generator für die Elemente in der kombinierten Liste erstellt. Dies hat den Vorteil, dass keine neue Liste erstellt werden muss. Sie können jedoch c so verwenden, als ob es die Verkettung der beiden Listen wäre:

_>>> for i in c:
...     print i
1
2
3
4
5
6
_

Wenn Ihre Listen umfangreich sind und Effizienz ein Problem darstellt, sind diese und andere Methoden aus dem Modul itertools sehr nützlich.

Beachten Sie, dass in diesem Beispiel die Elemente in c verbraucht werden, sodass Sie sie neu initialisieren müssen, bevor Sie sie wiederverwenden können. Natürlich können Sie einfach list(c) verwenden, um die vollständige Liste zu erstellen. Dadurch wird jedoch eine neue Liste im Speicher erstellt.

150
Scott Griffiths

concatenated_list = list_1 + list_2

110
Johan Kotlinski

Sie können auch sum verwenden, wenn Sie ein start-Argument angeben:

>>> list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
>>> all_lists = sum([list1, list2, list3], [])
>>> all_lists
[1, 2, 3, 'a', 'b', 'c', 7, 8, 9]

Dies funktioniert im Allgemeinen für alles, was den Operator + hat:

>>> sum([(1,2), (1,), ()], ())
(1, 2, 1)

>>> sum([Counter('123'), Counter('234'), Counter('345')], Counter())
Counter({'1':1, '2':2, '3':3, '4':2, '5':1})

>>> sum([True, True, False], False)
2

Mit der bemerkenswerten Ausnahme von Strings:

>>> sum(['123', '345', '567'], '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
94
Thomas Ahle

sie können jederzeit eine neue Liste erstellen, indem Sie zwei Listen hinzufügen.

>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]

Listen sind veränderbare Sequenzen, daher ist es meines Erachtens sinnvoll, die ursprünglichen Listen durch Erweitern oder Anhängen zu ändern.

44
pyfunc

Und wenn Sie mehr als zwei Listen zu verketten haben:

import operator
list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
reduce(operator.add, [list1, list2, list3])

# or with an existing list
all_lists = [list1, list2, list3]
reduce(operator.add, all_lists)

Dies spart Ihnen keine Zeit (Zwischenlisten werden noch erstellt), ist jedoch hilfreich, wenn Sie eine variable Anzahl von Listen zum Reduzieren haben, z. B. *args.

20
Jake Biesinger

Nur um Sie wissen zu lassen:

Wenn Sie list1 + list2 schreiben, rufen Sie die __add__ -Methode von list1 auf, die eine neue Liste zurückgibt. Auf diese Weise können Sie auch mit myobject + list1 umgehen, indem Sie die __add__ -Methode zu Ihrer persönlichen Klasse hinzufügen.

15
Ant