Làm cách nào để chuyển vị trí của hai mục trong danh sách Python?


208

Tôi chưa thể tìm ra giải pháp tốt cho vấn đề này trên mạng (có lẽ vì chuyển đổi, vị trí, danh sách và Python đều là những từ quá tải như vậy).

Nó khá đơn giản - Tôi có danh sách này:

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

Tôi muốn chuyển đổi vị trí của 'password2''password1'- không biết vị trí chính xác của họ, chỉ có điều họ ở ngay cạnh nhau và password2là người đầu tiên.

Tôi đã hoàn thành việc này với một số mục đăng ký danh sách khá dài, nhưng tôi tự hỏi liệu có thể đưa ra một cái gì đó thanh lịch hơn một chút không?


Vấn đề của bạn có phải là hiệu quả của việc cố gắng tìm 'password2' trong danh sách không? 'Password1' có thể đến trước 'password2' không? Có một số phức tạp ở đây mà không bắt gặp trong câu hỏi ban đầu của bạn? Nếu không, tôi đồng ý với @unwind.
Mã Brent viết

3
Bạn nên đăng những gì bạn đã có - Tôi tò mò về ý của bạn bằng cách "đăng ký danh sách khá dài dòng".
samtregar

Một cái gì đó dọc theo dòng của index1 = index ('password1'); index2 = index ('password2'); order = order [: index2] .append (order [index1]). append (order [index2]). append (order [index1 + 1:]); trải rộng trên một vài dòng Khá, không.
mikl

Câu trả lời:


392
    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

Trao đổi Python đơn giản trông như thế này:

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

Bây giờ tất cả những gì bạn cần làm là tìm ra cái gì ivà có thể dễ dàng thực hiện với index:

i = foo.index("password2")

15

Đưa ra thông số kỹ thuật của bạn, tôi sẽ sử dụng phép gán lát:

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

Phía bên phải của phép gán lát là "lát đảo ngược" và cũng có thể được đánh vần:

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

nếu bạn thấy rằng dễ đọc hơn, như nhiều người sẽ làm.


Tại sao điều này không hoạt động nếu bạn muốn chuyển tiêu đề và thư, yếu tố đầu tiên với thứ hai?
Luigi Tiburzi

Xin lỗi, giờ tôi đã hiểu, không có yếu tố nào ở i-1 nên một danh sách trống được trả về
Luigi Tiburzi

7

Làm thế nào nó có thể dài hơn

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

Đó chỉ là một trao đổi đơn giản sử dụng lưu trữ tạm thời.


13
Nếu bạn muốn thực sự "Pythonic" về nó, bạn luôn có thể làm điều này: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

là kết quả của điều này nếu phần tử cuối cùng lớn hơn phần tử tại vị trí ithì cả hai đều được hoán đổi.


-1

bạn có thể sử dụng ví dụ:

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

Tôi không phải là chuyên gia về trăn nhưng bạn có thể thử: nói

i = (1,2)

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

ở trên sẽ cho o / p là:

res(1, 2) = (2,1)

1
Điều đó không hoạt động mà không biết vị trí của các phím để trao đổi.
mikl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.