Bagaimana cara mengganti posisi dua item dalam daftar Python?

208

Saya belum dapat menemukan solusi yang baik untuk masalah ini di internet (mungkin karena saklar, posisi, daftar, dan Python adalah kata-kata yang kelebihan beban).

Ini agak sederhana - saya punya daftar ini:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']

Saya ingin beralih posisi 'password2'dan 'password1'- tidak mengetahui posisi pasti mereka, hanya saja mereka tepat di sebelah satu sama lain dan password2yang pertama.

Saya telah menyelesaikan ini dengan beberapa daftar-subskripsi yang agak bertele-tele, tetapi saya bertanya-tanya apakah mungkin untuk menghasilkan sesuatu yang sedikit lebih elegan?

mikl
sumber
Apakah masalah Anda adalah efisiensi dalam mencoba menemukan 'password2' dalam daftar? Bisakah 'password1' datang sebelum 'password2'? Apakah ada beberapa kompleksitas di sini yang tidak muncul dalam pertanyaan awal Anda? Kalau tidak, saya setuju dengan @unwind.
Brent Menulis Kode
3
Anda harus memposting apa yang Anda punya - Saya ingin tahu tentang apa yang Anda maksud dengan "daftar-subskripsi yang agak bertele-tele."
samtregar
Sesuatu di sepanjang baris index1 = index ('password1'); index2 = index ('password2'); order = order [: index2] .append (order [index1]). append (order [index2]). append (order [index1 +1:])); tersebar di beberapa baris lagi. Cantik, tidak.
mikl

Jawaban:

393
    i = ['title', 'email', 'password2', 'password1', 'first_name', 
         'last_name', 'next', 'newsletter']
    a, b = i.index('password2'), i.index('password1')
    i[b], i[a] = i[a], i[b]
samtregar
sumber
165

Pertukaran Python sederhana terlihat seperti ini:

foo[i], foo[j] = foo[j], foo[i]

Sekarang yang perlu Anda lakukan adalah mencari apa yang iada, dan itu dapat dengan mudah dilakukan dengan index:

i = foo.index("password2")
Bisa Berk Güder
sumber
15

Dengan spesifikasi Anda, saya akan menggunakan tugas-slice:

>>> L = ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
>>> i = L.index('password2')
>>> L[i:i+2] = L[i+1:i-1:-1]
>>> L
['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']

Sisi kanan penugasan slice adalah "slice terbalik" dan bisa juga dieja:

L[i:i+2] = reversed(L[i:i+2])

jika Anda menemukan itu lebih mudah dibaca, seperti banyak yang akan.

Alex Martelli
sumber
Mengapa ini tidak berfungsi jika Anda ingin mengganti judul dan surat, elemen pertama dengan yang kedua?
Luigi Tiburzi
Maaf saya sekarang mengerti, tidak ada elemen di i-1 sehingga daftar kosong dikembalikan
Luigi Tiburzi
7

Bagaimana bisa lebih lama dari itu?

tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp

Itu hanya swap biasa menggunakan penyimpanan sementara.

beristirahat
sumber
13
Jika Anda ingin benar-benar "Pythonic" tentang hal itu, Anda selalu dapat melakukan ini juga:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
Brent Writes Code
0
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

sebagai akibat dari ini jika elemen terakhir lebih besar dari elemen pada posisi imaka keduanya ditukar.

ravi tanwar
sumber
-1

Anda dapat menggunakan misalnya:

>>> test_list = ['title', 'email', 'password2', 'password1', 'first_name',
                 'last_name', 'next', 'newsletter']
>>> reorder_func = lambda x: x.insert(x.index('password2'),  x.pop(x.index('password2')+1))
>>> reorder_func(test_list)
>>> test_list
... ['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']
SmartElectron
sumber
-1

Saya bukan ahli dalam python tetapi Anda dapat mencoba: katakanlah

i = (1,2)

res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2)) 

di atas akan memberikan o / p sebagai:

res(1, 2) = (2,1)
lambzee
sumber
1
Itu tidak bekerja tanpa mengetahui posisi tombol untuk swap.
mikl