Ein Element in eine Liste verschieben?


104

Wie verschiebe ich in Python ein Element in einen bestimmten Index in einer Liste?

Antworten:


160

Verwenden Sie die insertMethode einer Liste:

l = list(...)
l.insert(index, item)

Alternativ können Sie eine Slice-Notation verwenden:

l[index:index] = [item]

Wenn Sie ein Element, das sich bereits in der Liste befindet, an die angegebene Position verschieben möchten, müssen Sie es löschen und an der neuen Position einfügen:

l.insert(newindex, l.pop(oldindex))

22
Denken Sie daran, dass das Verschieben eines Elements, das sich bereits in einer Liste befindet, mit der Einfüge- / Pop-Methode ein anderes Verhalten aufweist, je nachdem, ob Sie sich in Richtung der Vorder- oder Rückseite der Liste bewegen. Wenn Sie nach links gehen, fügen Sie vor dem ausgewählten Objekt ein. Wenn Sie nach hinten gehen, fügen Sie nach dem ausgewählten Element ein. Überprüfen Sie, ob Sie an das Ende der Liste gelangen (Indexfehler).
MKaras

Wie verschiebe ich mehrere Elemente? Bei gegebener Liste a = [1,2,3,4,5,6,7,8,9], wie man sie in [1,2, [3,4,5], 6,7,8,9 umwandelt ]? Kann dies in einem Schritt oder mit einem Listenverständnis erfolgen?
g33kz0r

@MKaras Ich habe dies mit Python 3.5 getestet und Sie können last index + 1ohne Fehler einfügen . In diesem Fall wird das Element nur an die Liste angehängt.
user2061057

@ user2061057 ist korrekt :) Selbst große Indizes führen dazu, dass am Ende Dinge eingefügt werden. a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
Lee Penkman

1
Für diejenigen, die versuchen, das Element am Ende mit Index -1 einzufügen, müssen Sie stattdessen len (l) verwenden.
nda

31

Eine etwas kürzere Lösung, die den Gegenstand nur bis zum Ende bewegt, nicht irgendwo ist:

l += [l.pop(0)]

Beispielsweise:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

13
Sie könnten genauso gut verwenden l.append(l.pop(0)). Es ist nur unwesentlich länger, aber viel besser lesbar.
Coredumperror

Wie kann ich es stattdessen an den Start verschieben?

19

Wenn Sie die Position des Elements nicht kennen, müssen Sie möglicherweise zuerst den Index suchen:

old_index = list1.index(item)

dann bewege es:

list1.insert(new_index, list1.pop(old_index))

oder meiner Meinung nach sauberer:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass

6
Ich denke, ich habe Recht, bei Ihrer passAussage zusammenzucken ... niemals Ausnahmen zu verbergen - die Standardeinstellung in einem Beispiel wie diesem sollte darin bestehen, eine sauberere Fehler- oder Druckanweisung bereitzustellen ... raise ValueError(f'Unable to move item to {new_index}')oder print(f'Moving item to {new_index} failed. List remains unchanged.'). Vielleicht passwäre es in Ordnung, wenn in einer Funktion try_to_move_itemoder so etwas, so dass verstanden wird, dass die Operation lautlos fehlschlagen könnte.
Flutefreak7

3

Eine sehr einfache Lösung, aber Sie müssen den Index der ursprünglichen Position und den Index der neuen Position kennen:

list1[index1],list1[index2]=list1[index2],list1[index1]

6
Dies ist ein Tausch, kein Zug.
Juzzlin

0

Ich habe einige Methoden zum Verschieben eines Elements innerhalb derselben Liste mit timeit vorgestellt. Hier sind diejenigen, die verwendet werden sollen, wenn j> i:

┌───────────────────────────────────┐
│ 14.4usec │ x [i: i] = x.pop (j), │
│ 14.5usec │ x [i: i] = [x.pop (j)] │
│ 15.2usec │ x.insert (i, x.pop (j)) │
└───────────────────────────────────┘

und hier diejenigen, die verwendet werden sollen, wenn j <= i:

┌────────────────────────────────────────┐
│ 14.4usec │ x [i: i] = x [j]; del x [j] │
│ 14.4usec │ x [i: i] = [x [j]]; del x [j] │
│ 15.4usec │ x.insert (i, x [j]); del x [j] │
└────────────────────────────────────────┘

Kein großer Unterschied, wenn Sie es nur ein paar Mal verwenden, aber wenn Sie schwere Dinge wie manuelles Sortieren ausführen, ist es wichtig, das schnellste zu nehmen. Ansonsten würde ich empfehlen, nur die zu nehmen, die Ihrer Meinung nach am besten lesbar ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.