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?


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]

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")

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.


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.


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.


-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']

-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)

1
Itu tidak bekerja tanpa mengetahui posisi tombol untuk swap.
mikl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.