2010-03-22 40 views
122

我一直没有找到一个很好的解决方案在网络上的这个问题(可能是因为开关,位置,列表和Python都是这样重载的话)。如何在Python列表中切换两个项目的位置?

这是相当简单 - 我有这样的名单:

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

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

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

+0

你的问题是试图在列表中找到'password2'的效率吗? 'password1'可以在'password2'之前吗?在你的原始问题中没有遇到复杂性吗? 否则我同意@unwind。 – 2010-03-22 16:31:27

+3

你应该发布你所拥有的 - 我很好奇你的意思是“相当冗长的列表下标”。 – samtregar 2010-03-22 16:33:45

+0

沿着index1 = index('password1')的行; index2 = index('password2'); order = order [:index2] .append(order [index1])。append(order [index2])。append(order [index1 + 1:]);在更多的线上传播。漂亮,没有。 – mikl 2010-03-22 19:06:33

回答

249
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] 
5

如何以往任何时候都长于

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

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

+6

如果你想真的是“Pythonic”,你也可以这样做:'my_list [indexOfPwd2],my_list [indexOfPwd2 + 1] = my_list [indexOfPwd2 + 1],my_list [indexOfPwd2]' – 2010-03-22 16:32:36

104

简单的Python交换看起来是这样的:

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

现在,所有你需要做的就是数字是什么i,并可以很容易地与index完成:

i = foo.index("password2") 
13

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

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

如果您发现更具可读性,因为许多人会。

+0

为什么这不是如果你想切换标题和邮件,第一个元素与第二个? – 2013-10-26 14:29:06

+0

对不起,我现在明白了,在i-1中没有元素,所以返回一个空列表 – 2013-10-26 14:35:33

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

我不是在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) 
+1

如果不知道要交换的键的位置,这是行不通的。 – mikl 2016-08-06 13:00:08