Fügen Sie ein Element an einem bestimmten Index in eine Liste ein und geben Sie die aktualisierte Liste zurück

98

Ich habe das:

>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]

>>> print a.insert(2, 3)
None

>>> print a
[1, 2, 3, 4]

>>> b = a.insert(3, 6)
>>> print b
None

>>> print a
[1, 2, 3, 6, 4]

Kann ich die aktualisierte Liste trotzdem als Ergebnis erhalten, anstatt die ursprüngliche Liste zu aktualisieren?

ATOzTOA
quelle
11
b = a[:].insert(2,3)scheint ziemlich kurz zu sein, wirkt sich nicht auf die ursprüngliche Liste aus und ist ziemlich beschreibend.
mkoistinen
6
@mkoistinen Es funktioniert nicht bei mir. >>> a = [1, 2, 3, 4] >>> b = a[:].insert(2, 5) >>> print b None
SparkAndShine

Antworten:

89

l.insert(index, obj)gibt eigentlich nichts zurück, sondern aktualisiert nur die Liste. Wie ATO sagte, können Sie tun b = a[:index] + [obj] + a[index:]. Ein anderer Weg ist jedoch:

a = [1, 2, 4]
b = a[:]
b.insert(2, 3)
Rushy Panchal
quelle
56
Wenn Sie 3 Zeilen lesbaren Codes nicht tolerieren können, fügen Sie ihn in eine Funktion ein und rufen Sie ihn auf.
IceArdor
53

Leistungsstärkster Ansatz

Sie können das Element auch mithilfe der Slice-Indizierung in die Liste einfügen . Beispielsweise:

>>> a = [1, 2, 4]
>>> insert_at = 2  # index at which you want to insert item

>>> b = a[:]   # created copy of list "a" as "b"
               # skip this step if you are ok with modifying original list

>>> b[insert_at:insert_at] = [3]  # insert "3" within "b"
>>> b
[1, 2, 3, 4]

Um mehrere Elemente an einem bestimmten Index zusammenzufügen , müssen Sie lediglich eines listvon mehreren Elementen verwenden, die Sie einfügen möchten. Beispielsweise:

>>> a = [1, 2, 4]
>>> insert_at = 2   # index starting from which multiple elements will be inserted 

# List of elements that you want to insert together at "index_at" (above) position
>>> insert_elements = [3, 5, 6]

>>> a[insert_at:insert_at] = insert_elements
>>> a   # [3, 5, 6] are inserted together in `a` starting at index "2"
[1, 2, 3, 5, 6, 4]

Alternative mit Listenverständnis (aber sehr langsam in Bezug auf die Leistung) :

Als Alternative kann erreicht werden unter Verwendung Liste Verständnis mit enumeratezu. (Aber bitte machen Sie es nicht so. Es dient nur zur Veranschaulichung) :

>>> a = [1, 2, 4]
>>> insert_at = 2

>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]

Leistungsvergleich aller Lösungen

Hier ist der timeitVergleich aller Antworten mit einer Liste von 1000 Elementen für Python 3.4.5:

  • Meine Antwort mit geschnittener Einfügung - Am schnellsten (3,08 usec pro Schleife)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
    100000 loops, best of 3: 3.08 usec per loop
  • Die von ATOzTOA akzeptierte Antwort basiert auf der Zusammenführung von geschnittenen Listen - Zweiter (6,71 usec pro Schleife)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
    100000 loops, best of 3: 6.71 usec per loop
  • Rushy Panchals Antwort mit den meisten Stimmen unter Verwendung vonlist.insert(...)- Dritter (26,5 usec pro Schleife)

    python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
    10000 loops, best of 3: 26.5 usec per loop
  • Meine Antwort mit Listenverständnis undenumerate- Viertens (sehr langsam mit 168 usec pro Schleife)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
    10000 loops, best of 3: 168 usec per loop
Moinuddin Quadri
quelle
2
Ich mag dieses Ergebnis wirklich, weil es sich leicht erweitern lässt, um das Problem zu lösen. Was ist, wenn ich die Werte 3, 3.5(in der Reihenfolge) in diese Liste einfügen möchte -> a[2:2] = [3,3.5]. Sehr ordentlich
Minillinim
1
Wie funktioniert eine [2: 2] = a_list? a [2: 2] beginnt grundsätzlich vom 2. Index zum 1. Index (2-1), jedoch in Vorwärtsrichtung, was eine leere [] Liste bedeutet. Wie erstreckt es sich? Wenn wir [2: 3: -1] machen, funktioniert es nicht.
SamCodes
Gute Antwort. Ich frage mich, ob die Komplexität der besten Wahl O (1) ist. Wenn ja warum?
Lerner Zhang
Diese Antwort muss aktualisiert werden. Ausnahmsweise kann ich die gemeldeten Timings selbst mit Python 3.4 nicht reproduzieren (ich erhalte einen Faktor 2 zwischen list.insertund Slice-Zuweisung), und unter Python 3.8 ist dieser Unterschied vollständig verschwunden. Der klarste Weg, ein Element einzufügen list.insert, ist natürlich die Verwendung.
a_guest
39

Am kürzesten habe ich: b = a[:2] + [3] + a[2:]

>>> 
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> b = a[:2] + [3] + a[2:]
>>> print a
[1, 2, 4]
>>> print b
[1, 2, 3, 4]
ATOzTOA
quelle
Die Anzahl der Codezeilen ist kein gutes Maß für die Codequalität. Dieser Ansatz ist sowohl aus Gründen der Leistung als auch der Lesbarkeit fehlerhaft.
a_guest
0

Am saubersten ist es, die Liste zu kopieren und das Objekt dann in die Kopie einzufügen. Unter Python 3 kann dies erfolgen über list.copy:

new = old.copy()
new.insert(index, value)

Beim Kopieren von Python 2 kann die Liste über erreicht werden new = old[:](dies funktioniert auch bei Python 3).

In Bezug auf die Leistung gibt es keinen Unterschied zu anderen vorgeschlagenen Methoden:

$ python --version
Python 3.8.1
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b.insert(500, 3)"
100000 loops, best of 5: 2.84 usec per loop
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b[500:500] = (3,)"
100000 loops, best of 5: 2.76 usec per loop
ein Gast
quelle
-1

Verwenden Sie die Python list insert () -Methode . Verwendung:

Syntax

Es folgt die Syntax für die Methode insert () -

list.insert(index, obj)

Parameter

  • index - Dies ist der Index, in den das Objekt obj eingefügt werden muss.
  • obj - Dies ist das Objekt, das in die angegebene Liste eingefügt werden soll.

Rückgabewert

Diese Methode gibt keinen Wert zurück, fügt jedoch das angegebene Element am angegebenen Index ein.

Beispiel:

a = [1,2,4,5]

a.insert(2,3)

print(a)

Kehrt zurück [1, 2, 3, 4, 5]

Arjun Sanchala
quelle
1
Dies beantwortet die Frage nicht.
Gustav Bertram
4
Die Frage war spezifisch: Is there anyway I can get the updated list as result, instead of updating the original list in place?Ihre Antwort macht das Gegenteil.
Laszlowaty