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

如何在Python列表中切换两个项目的位置?,python,list,Python,List,我还没有在网上找到解决这个问题的好方法(可能是因为switch、position、list和Python都是重载词) 这相当简单——我有以下清单: ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter'] 我想切换'password2'和'password1'的位置-不知道它们的确切位置,只是它们紧挨着一个,而password2是第一个 我已经通过一些冗长的列表订阅

我还没有在网上找到解决这个问题的好方法(可能是因为switch、position、list和Python都是重载词)

这相当简单——我有以下清单:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
我想切换
'password2'
'password1'
的位置-不知道它们的确切位置,只是它们紧挨着一个,而
password2
是第一个


我已经通过一些冗长的列表订阅完成了这一点,但我想知道是否有可能想出一些更优雅的东西?

它怎么可能比

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

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

简单的Python交换如下所示:

foo[i], foo[j] = foo[j], foo[i]
现在,您需要做的就是计算出
i
是什么,这可以通过
index
轻松完成:

i = foo.index("password2")

根据您的规格,我将使用切片分配:

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

如果您发现它更具可读性,许多人都会这样做。

您可以使用以下示例:

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

我不是python专家,但您可以尝试: 说

上面给出的o/p为:

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

因此,如果最后一个元素大于位于
i
位置的元素,则它们都会被交换。

您的问题是在列表中查找“password2”的效率吗?“password1”能排在“password2”之前吗?这里是否有一些复杂的问题在你最初的问题中没有遇到?否则我同意@unwind。你应该发布你所拥有的——我很好奇你所说的“相当冗长的列表订阅”是什么意思;index2=索引(“密码2”);订单=订单[:index2]。追加(订单[index1])。追加(订单[index2])。追加(订单[index1+1:]);再多排几行。很好,不是。如果你真的想对它“Pythonic”,你也可以这样做:
my_list[indexoftwd2]、my_list[indexoftwd2+1]=my_list[indexoftwd2+1]、my_list[indexoftwd2]
如果你想切换标题和邮件,第一个元素和第二个元素为什么不起作用?对不起,我现在明白了,i-1处没有元素,因此返回一个空列表,如果不知道要交换的键的位置,该列表将不起作用。
i = (1,2)

res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2)) 
res(1, 2) = (2,1)
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break