Pindahkan item ke dalam daftar?

104

Dengan Python, bagaimana cara memindahkan item ke indeks tertentu dalam daftar?

Gabriele Cirulli
sumber

Jawaban:

160

Gunakan insertmetode daftar:

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

Sebagai alternatif, Anda dapat menggunakan notasi irisan:

l[index:index] = [item]

Jika Anda ingin memindahkan item yang sudah ada dalam daftar ke posisi yang ditentukan, Anda harus menghapusnya dan menyisipkannya di posisi baru:

l.insert(newindex, l.pop(oldindex))
David Z
sumber
22
Perlu diingat bahwa memindahkan item yang sudah ada dalam daftar dengan metode sisipkan / pop akan memiliki perilaku yang berbeda tergantung apakah Anda bergerak ke depan atau belakang daftar. Pindah ke kiri Anda menyisipkan sebelum objek yang Anda pilih. Pindah ke belakang Anda masukkan setelah item yang Anda pilih. Periksa pindah ke akhir daftar (kesalahan indeks).
MKaras
Bagaimana cara memindahkan banyak elemen? Diberikan daftar a = [1,2,3,4,5,6,7,8,9], bagaimana mengubahnya menjadi [1,2, [3,4,5], 6,7,8,9 ]? Bisakah ini dilakukan dalam satu langkah atau dengan pemahaman daftar?
g33kz0r
@MKaras Saya menguji ini dengan Python 3.5 dan Anda BISA menyisipkan last index + 1tanpa kesalahan. Dalam kasus itu, elemen hanya ditambahkan ke daftar.
pengguna2061057
@ user2061057 benar :) bahkan indeks yang besar akan menghasilkan hal-hal yang disisipkan di akhir. a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
lee penkman
1
Bagi mereka yang mencoba menggunakan indeks -1 untuk menyisipkan item di akhir, Anda harus menggunakan len (l) sebagai gantinya.
nda
31

Solusi yang sedikit lebih pendek, yang hanya memindahkan item ke bagian akhir, bukan di mana pun adalah:

l += [l.pop(0)]

Sebagai contoh:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]
Tim
sumber
13
Anda mungkin juga menggunakan l.append(l.pop(0)). Ini hanya sedikit lebih panjang, tetapi jauh lebih mudah dibaca.
coredumperror
Bagaimana saya bisa memindahkannya ke awal?
19

Jika Anda tidak mengetahui posisi item, Anda mungkin perlu mencari indeksnya terlebih dahulu:

old_index = list1.index(item)

lalu pindahkan:

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

atau IMHO cara yang lebih bersih:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass
nngeek
sumber
6
Saya rasa saya benar untuk merasa ngeri pada passpernyataan Anda ... jangan pernah menyembunyikan pengecualian - hal default dalam contoh seperti ini seharusnya memberikan pernyataan kesalahan atau pernyataan cetak yang lebih bersih ... raise ValueError(f'Unable to move item to {new_index}')atau print(f'Moving item to {new_index} failed. List remains unchanged.'). Mungkin passakan baik-baik saja jika dalam fungsi dipanggil try_to_move_itematau sesuatu sehingga dipahami bahwa operasi mungkin gagal secara diam-diam.
flutefreak7
3

Solusinya sangat sederhana, tetapi Anda harus mengetahui indeks posisi awal dan indeks posisi baru:

list1[index1],list1[index2]=list1[index2],list1[index1]
V. Petretto
sumber
6
Ini adalah pertukaran, bukan gerakan.
juzzlin
0

Saya membuat profil beberapa metode untuk memindahkan item dalam daftar yang sama dengan timeit. Berikut ini yang akan digunakan jika j> i:

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

dan di sini yang akan digunakan jika 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. Masukkan (i, x [j]); del x [j] │
└──────────┴──────────────────────────┘

Bukan perbedaan besar jika Anda hanya menggunakannya beberapa kali, tetapi jika Anda melakukan hal-hal berat seperti penyortiran manual, penting untuk mengambil yang tercepat. Jika tidak, saya sarankan untuk mengambil salah satu yang menurut Anda paling mudah dibaca.

Riedler Musics
sumber