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


208

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

这很简单–我有以下列表:

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

我想切换位置,'password2'并且'password1'–不知道它们的确切位置,只知道它们彼此紧靠且排password2在第一位。

我已经完成了一些比较漫长的列表下标操作,但是我想知道是否可以提出一些更优雅的方法?


您的问题是在列表中查找“ password2”的效率高吗?可以在“ password2”之前输入“ password1”吗?这里是否存在您原始问题中没有遇到的一些复杂性?否则,我同意@unwind。
布伦特撰写代码

3
您应该发布您所拥有的内容-我对您的意思是“相当冗长的列表下标”感到好奇。
萨姆特加

类似于index1 = index('password1'); index2 = index('password2'); order = order [:index2] .append(order [index1])。append(order [index2])。append(order [index1 + 1:]); 散布在几行上。漂亮,不。
mikl

Answers:


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

165

简单的Python交换如下所示:

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

现在您所要做的就是弄清楚是什么i,并且可以轻松地通过以下方法完成index

i = foo.index("password2")

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

如果您发现它更具可读性,那么它就会变得更多。


如果要切换标题和邮件(第一个元素和第二个元素),为什么这不起作用?
Luigi Tiburzi 2013年

抱歉,我现在明白了,i-1处没有元素,所以返回了一个空列表
Luigi Tiburzi 2013年

7

怎么会比

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

那只是使用临时存储的简单交换。


13
如果您想真正做到“ Pythonic”,也可以始终这样做:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
Brent

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

结果,如果最后一个元素大于位置上的元素,i那么它们都会被交换。


-1

您可以使用例如:

>>> 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.