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?
Ja: list1+list2
. Dies gibt eine neue Liste, die die Verkettung von list1
und list2
ist.
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.
concatenated_list = list_1 + list_2
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]
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.
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
.
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.