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

我一直没有find一个很好的解决scheme在networking上的这个问题(可能是因为开关,位置,列表和Python都是如此重载的话)。

这很简单 – 我有这个列表:

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

我想切换'password2''password1'位置 – 不知道它们的确切位置,只是它们紧挨着, 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] 

简单的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]) 

如果你发现更多的可读性,尽可能多。

它怎么会比这更长

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

这只是一个简单的交换使用临时存储。

你可以使用例如:

 >>> 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的专家,但你可以尝试:说

 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)