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

259

我没有在网上找到一个好的解决这个问题的方法(可能是因为switch、position、list和Python都是如此过载的词汇)。

这相当简单——我有这个列表:

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

我想交换'password2''password1'的位置-不知道它们的确切位置,只知道它们紧挨在一起,而且password2在前面。

我用了一些比较冗长的列表下标来完成这个问题,但我想知道是否有更加优雅的解决方法?


你的问题是在列表中查找'password2'的效率吗? 'password1'可以出现在'password2'之前吗? 这里是否存在一些复杂性,这在你最初的问题中没有体现?否则我同意@unwind。 - Brent Writes Code
3
你应该发布你所拥有的东西——我很想知道你所谓的“相当冗长的列表下标”是什么意思。 - samtregar
类似于 index1 = index('password1'); index2 = index('password2'); order = order[:index2].append(order[index1]).append(order[index2]).append(order[index1 + 1:]); 这样的代码需要分几行写。看起来不太美观。 - mikl
8个回答

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

216

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

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

现在你需要做的就是确定i是什么,这可以很容易地用index来完成:

i = foo.index("password2")

18

根据你的规格,我会使用切片赋值:

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

如果您发现更易读,那么许多人都会这样认为。


1
为什么这不起作用,如果你想交换标题和邮件,第一个元素和第二个元素? - Luigi Tiburzi

8

如何使其长度变长

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

这只是使用临时存储进行的简单交换。


15
如果你想真正做到“Pythonic”,你也可以这样做:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2] - Brent Writes Code

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

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

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

这并不是将每个元素与下一个元素交换。它只是将第一个元素推到最后一个位置。 - Azhar Khan

-2

我不是Python的专家,但你可以尝试一下:

i = (1,2)

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

以上将输出:

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

2
不知道要交换的键的位置,这是行不通的。 - mikl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接