Как переключить положение двух элементов в списке Python?

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

Его довольно простой - у меня есть этот список:

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

Мне нравится переключаться на позицию 'password2' и 'password1' - не зная их точного положения, только в том случае, если они находятся рядом друг с другом, а password2 - первым.

Ive выполнил это с довольно длинным списком-подписью, но я подумал, что можно придумать что-то более элегантное?

    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]
318
ответ дан 22 марта '10 в 19:31
источник

Простая замена Python выглядит следующим образом:

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

Теперь вам нужно всего лишь указать, что i, и это легко сделать с помощью index:

i = foo.index("password2")
132
ответ дан 22 марта '10 в 19:30
источник

Учитывая ваши спецификации, я бы использовал назначение 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']

Правая часть назначения среза представляет собой "обратный срез" и также может быть записана:

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

если вы найдете это более удобочитаемым, как многие из них.

15
ответ дан 22 марта '10 в 19:35
источник

Как это может быть дольше, чем

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

Это просто простой обмен с использованием временного хранилища.

6
ответ дан 22 марта '10 в 19:27
источник

Я не эксперт в python, но вы можете попробовать: скажем

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)
0
ответ дан 06 авг. '16 в 14:09
источник

Вот Это Да! Там гораздо больше стандартного (применимо ко всем языкам) простого и более короткого пути!

x = i[2]; i[2] = i[3]; i[3] = x

Простое лучше, чем сложное

Примечание: если вы не знаете должность:

index = list.index("password1")  # = 3 in the given list
0
ответ дан 11 мая '18 в 20:56
источник

вы можете использовать, например:

>>> 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']
0
ответ дан 20 марта '16 в 10:58
источник
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

в результате этого, если последний элемент больше, чем элемент в позиции i они оба меняются местами.

0
ответ дан 07 июля '18 в 20:49
источник