Ein Element in eine Liste verschieben?

104

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

Gabriele Cirulli
quelle

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))
David Z.
quelle
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]
Tim
quelle
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
nngeek
quelle
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]
V.Petretto
quelle
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.

Riedler Musik
quelle