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

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

其实很简单——我有这样一个列表:

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

我想切换'password2''password1'的位置-不知道它们的确切位置,只知道它们紧挨着彼此,而password2是第一个。

我已经完成了一些相当冗长的列表下标,但我想知道是否有可能想出一些更优雅的东西?

382009 次浏览

怎么可能比

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

考虑到你的规格,我会使用切片分配:

>>> 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方面的专家,但你可以试试: 说< / p >
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)
for i in range(len(arr)):
if l[-1] > l[i]:
l[-1], l[i] = l[i], l[-1]
break

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

如何交换列表中的每个元素与下一个

  for i in range(len(list)):
try:
list[i+1]
except IndexError:
continue
else:
list[i],list[i+1] = list[i+1],list[i]