2010-12-03 7 views

Antwort

787

Ja: list1+list2. Dies ergibt eine neue Liste, die die Verkettung von list1 und list2 darstellt.

+1

Nun, das erklärt es. Ich suchte nach einem Funktionsnamen, nicht nach einem Operator (Ja, ich weiß, dass Operatoren durch versteckte Funktionen implementiert werden.) –

+28

Eigentlich können Sie dies tun, indem Sie eine nicht versteckte Funktion verwenden: import operator, operator.add (list1, list2) –

+2

@ NPE Was ist, wenn ich eine beliebige Anzahl von Liste verketten möchte? Wie kann ich die Funktion definieren? Vielen Dank. – twlkyao

56

Wie wäre es mit list1 + list2?

+69

eine Minute ist der Unterschied zwischen 300 Stimmen – Vall3y

+4

500 jetzt ...! : (:( –

+2

625 ...................! – Arun

38

Sie könnten immer eine neue Liste erstellen, die sich aus dem Hinzufügen von zwei Listen ergibt.

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

Listen sind wandelbar Sequenzen, damit ich es Sinn erraten macht von erweitern oder fügen Sie die ursprünglichen Listen zu ändern.

+2

Es macht nur Sinn, die ursprünglichen Listen zu ändern, wenn Sie die unmodified Listen nicht mehr benötigen, so in diesem Fall würde es keinen Sinn machen –

123

Je nachdem, wie du gehst, es zu benutzen, wenn es itertools.chain erstellt wird möglicherweise die beste Wahl:

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

Dieser einen Generator für die Elemente in der kombinierten Liste erstellt, was den Vorteil hat, dass keine neuen Liste muss erstellt werden, aber man kann immer noch verwenden c, als ob es die Verkettung der beiden Listen waren:

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

Wenn Ihre Listen sind groß und Effizienz ist ein Anliegen, dann diese und andere Methoden aus den itertools Modul sind sehr praktisch zu wissen.

Beachten Sie, dass dieses Beispiel die Elemente in c verbraucht. Sie müssen es also neu initialisieren, bevor Sie es wiederverwenden können. Natürlich können Sie einfach list(c) verwenden, um die vollständige Liste zu erstellen, aber das wird eine neue Liste im Speicher erstellen.

+8

nur sagen, dass itertools.chain zurückgibt ein Generator ... – Ant

15

Nur damit Sie wissen:

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

15

Und wenn Sie mehr als zwei Listen haben zu verketten:

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) 

Es ist nicht wirklich sparen Sie jederzeit (Zwischenlisten werden noch erstellt), aber schön, wenn man eine variable Anzahl von Listen haben abzuflachen zB *args.

67

Sie können auch sum verwenden, wenn Sie es ein start Argument geben:

>>> 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 ist für alles, was in der Regel funktioniert, der die + Betreiber 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] 
+1

In Python 3.5.2 ist 'sum' dokumentiert, um zu sagen:" Diese Funktion ist speziell für die Verwendung mit numerischen Werten vorgesehen und kann nicht-numerische Typen zurückweisen. "Ich bin mir also nicht sicher, dass' sum' sein sollte so benutzt –

+0

Guter Fang auf der documenta tion. Komisch, dass sie nicht nur nicht numerische Werte zurückweisen würden, anstatt die Absicht in den Dokumenten zu begraben. – kevlarr

Verwandte Themen