Як переключити положення двох елементів у списку Python?


208

Мені не вдалося знайти хорошого рішення цієї проблеми в мережі (можливо, тому що перемикач, позиція, список та Python - це все такі перевантажені слова).

Це досить просто - у мене є цей список:

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

Я хотів би змінити положення 'password2'і 'password1'- не знаючи їх точного положення, тільки те, що вони розташовані поруч і password2є першими.

Я домігся цього за допомогою декількох досить затятих підписок на список, але я задумався, чи можна придумати щось більш елегантне?


Ваша проблема - ефективність спроби знайти "password2" у списку? Чи може "password1" перейти до "password2"? Чи є тут якась складність, яка не зустрічається у вашому первісному питанні? Інакше я згоден з @unwind.
Brent пише Code

3
Ви повинні опублікувати те, що у вас є, - мені цікаво, що ви маєте на увазі під "досить довгодушним підпискою на список".
самтрегар

Щось уздовж рядків index1 = index ('password1'); index2 = індекс ('password2'); order = order [: index2] .append (order [index1]). append (order [index2]). append (order [index1 + 1:]); поширення на ще кілька рядків. Гарненько, ні.
mikl

Відповіді:


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

Простий своп Python виглядає так:

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

Тепер все, що вам потрібно зробити, - це зрозуміти, що iтаке, і що можна легко зробити за допомогою index:

i = foo.index("password2")

15

З огляду на ваші характеристики, я б використав фрагмент призначення:

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

Права частина призначення фрагмента - це "зворотний фрагмент", і він також може бути написаний:

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

якщо ви вважаєте, що це читабельніше, як багато хто з них.


Чому це не працює, якщо ви хочете переключити заголовок та пошту, перший елемент на другий?
Луїджі Тібурзі

Вибачте, я зараз розумію, що в i-1 немає елементів, тому порожній список повертається
Луїджі Тібурзі

7

Як це коли-небудь може бути довше

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

Це просто звичайний своп із використанням тимчасового зберігання.


13
Якщо ви хочете бути по-справжньому "пітонічним" з цього приводу, ви також завжди можете це зробити:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
Brent пише код

0
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

в результаті цього, якщо останній елемент є більшим за елемент у позиції, iвони обидва поміняються місцями.


-1

Ви можете використовувати, наприклад:

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

Я не знавець пітона, але ви можете спробувати: скажіть

i = (1,2)

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

вище дасть o / p як:

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

1
Це не спрацює, не знаючи положення клавіш для заміни.
mikl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.