3111 Stimmen

Was ist der Unterschied zwischen den Python-Listenmethoden append und extend?

Was ist der Unterschied zwischen den Listenmethoden append() y extend() ?

67voto

Erik Punkte 2423

Die beiden folgenden Ausschnitte sind semantisch äquivalent:

for item in iterator:
    a_list.append(item)

y

a_list.extend(iterator)

Letzteres kann schneller sein, da die Schleife in C implementiert ist.

22 Stimmen

Das Erweitern ist auf meinem Rechner ~4x schneller als das Anhängen in einer Schleife (16us gegenüber 4us für 100 Schleifen mit Nullen)

6 Stimmen

extend() wahrscheinlich eine Vorabzuweisung, während append() wahrscheinlich nicht.

0 Stimmen

@MadPhysicist: Der Vollständigkeit halber sei gesagt, dass es Zeiten gibt, in denen extend() kann nicht vernünftig vorzuteilen, da einige Iterables nicht implementieren __len__() aber wie Sie wäre ich überrascht, wenn sie es nicht versuchen würde. Ein Teil des Leistungsgewinns kommt auch dadurch zustande, dass der Iterationsteil in reinem C statt in Python ausgeführt wird, wie es in Aaron's Antwort .

47voto

CodyChan Punkte 1656

Le site append() Methode fügt ein einzelnes Element an das Ende der Liste an.

x = [1, 2, 3]
x.append([4, 5])
x.append('abc')
print(x)
# gives you
[1, 2, 3, [4, 5], 'abc']

Le site extend() Methode nimmt ein Argument, eine Liste, und fügt jedes der Elemente des Arguments an die ursprüngliche Liste an. (Listen sind als Klassen implementiert. Das "Erstellen" einer Liste ist in Wirklichkeit die Instanziierung einer Klasse. Als solche hat eine Liste Methoden, die mit ihr arbeiten.)

x = [1, 2, 3]
x.extend([4, 5])
x.extend('abc')
print(x)
# gives you
[1, 2, 3, 4, 5, 'a', 'b', 'c']

から Eintauchen in Python .

0 Stimmen

Sie können nicht mit nur 6 erweitern, da es nicht iterierbar ist. Und die zweite Ausgabe in Ihrem Beispiel ist falsch. 'abc' wird als einzelnes Element hinzugefügt, da Sie es an extend als eine Liste mit einem Element ['abc'] : [1, 2, 3, 4, 5, 'abc']. Um die Ausgabe Ihres Beispiels korrekt zu machen, ändern Sie die Zeile abc in: x.extend('abc') . Und entfernen Sie die x.extend(6) oder ändern Sie es in x.extend([6]) .

0 Stimmen

Auch "Die extend()-Methode nimmt ein Argument, eine Liste," ist falsch

41voto

denfromufa Punkte 5527

Sie können "+" für die Rückgabe von extend verwenden, anstatt an Ort und Stelle zu extendieren.

l1=range(10)

l1+[11]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11]

l2=range(10,1,-1)

l1+l2

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2]

Ähnlich += für das Verhalten an Ort und Stelle, jedoch mit leichten Unterschieden zu append & extend . Einer der größten Unterschiede zwischen += de append y extend ist, wenn er in Funktionsbereichen verwendet wird, siehe dieser Blogbeitrag .

0 Stimmen

Hat die Verwendung des '+' zur Rückgabe von extend Auswirkungen auf die Zeitkomplexität?

5 Stimmen

@franklin, siehe diese Antwort für Details: stackoverflow.com/a/28119966/2230844

3 Stimmen

Ich verstehe nicht, wie das die Frage beantworten soll

25voto

Chaitanya Punkte 1682

append(object) - Aktualisiert die Liste durch Hinzufügen eines Objekts zur Liste.

x = [20]
# List passed to the append(object) method is treated as a single object.
x.append([21, 22, 23])
# Hence the resultant list length will be 2
print(x)
--> [20, [21, 22, 23]]

extend(list) - Verkettet im Wesentlichen zwei Listen.

x = [20]
# The parameter passed to extend(list) method is treated as a list.
# Eventually it is two lists being concatenated.
x.extend([21, 22, 23])
# Here the resultant list's length is 4
print(x)
[20, 21, 22, 23]

23voto

kiriloff Punkte 24291

extend() kann mit einem Iterator-Argument verwendet werden. Hier ist ein Beispiel. Sie möchten auf diese Weise eine Liste aus einer Liste von Listen erstellen:

Von

list2d = [[1,2,3],[4,5,6], [7], [8,9]]

Sie wollen

>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Sie können verwenden itertools.chain.from_iterable() zu tun. Die Ausgabe dieser Methode ist ein Iterator. Seine Implementierung ist äquivalent zu

def from_iterable(iterables):
    # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

Zurück zu unserem Beispiel, wir können Folgendes tun

import itertools
list2d = [[1,2,3],[4,5,6], [7], [8,9]]
merged = list(itertools.chain.from_iterable(list2d))

und rufen Sie die Fahndungsliste auf.

So sieht die Entsprechung aus extend() kann mit einem Iterator-Argument verwendet werden:

merged = []
merged.extend(itertools.chain.from_iterable(list2d))
print(merged)
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

3 Stimmen

Diese Antwort stellt extend und append nicht gegenüber und beantwortet daher nicht die Frage

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