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

时间:2010-03-22 16:25:14

标签: python list

我无法在网上找到这个问题的好方法(可能是因为开关,位置,列表和Python都是这样的重载词)。

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

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

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

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

8 个答案:

答案 0 :(得分:345)

    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]

答案 1 :(得分:138)

简单的Python交换如下所示:

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

现在您需要做的就是i是什么,可以使用index轻松完成:

i = foo.index("password2")

答案 2 :(得分: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])

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

答案 3 :(得分:6)

它怎么能比

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

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

答案 4 :(得分:1)

哇!有一个更标准(适用于所有语言),简单和更短的方式!

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

简单比复杂更好

注意:如果您不知道该职位:

index = list.index("password1")  # = 3 in the given list

答案 5 :(得分:0)

你可以使用例如:

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

答案 6 :(得分:0)

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

i = (1,2)

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

以上将o / p as:

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

答案 7 :(得分:0)

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

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