如何在Python列表中切换两个项目的位置?

mik*_*ikl 193 python list

我无法在网上找到这个问题的好解决方案(可能因为交换机,位置,列表和Python都是这样的重载词).

这很简单 - 我有这个清单:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
Run Code Online (Sandbox Code Playgroud)

我想切换的位置'password2''password1'-不知道他们的确切位置,只知道他们是对彼此相邻并password2是第一.

我用一些相当冗长的列表下标来完成这个,但我想知道它可能会提出一些更优雅的东西吗?

sam*_*gar 365

    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]
Run Code Online (Sandbox Code Playgroud)


Can*_*der 151

简单的Python交换如下所示:

foo[i], foo[j] = foo[j], foo[i]
Run Code Online (Sandbox Code Playgroud)

现在您需要做的就是确定什么i是,并且可以通过以下方式轻松完成index:

i = foo.index("password2")
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 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']
Run Code Online (Sandbox Code Playgroud)

切片分配的右侧是"反转切片",也可以拼写:

L[i:i+2] = reversed(L[i:i+2])
Run Code Online (Sandbox Code Playgroud)

如果你发现它更具可读性,那就像许多人一样.


unw*_*ind 6

它怎么会比...更长

tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp
Run Code Online (Sandbox Code Playgroud)

这只是使用临时存储的普通交换.

  • 如果你想成为真正的"Pythonic",你也可以这样做:`my_list [indexOfPwd2],my_list [indexOfPwd2 + 1] = my_list [indexOfPwd2 + 1],my_list [indexOfPwd2]` (12认同)