如何在Python列表中切换两个项目的位置?
我还没有在网上找到解决这个问题的好方法(可能是因为switch、position、list和Python都是重载词) 这相当简单——我有以下清单:如何在Python列表中切换两个项目的位置?,python,list,Python,List,我还没有在网上找到解决这个问题的好方法(可能是因为switch、position、list和Python都是重载词) 这相当简单——我有以下清单: ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter'] 我想切换'password2'和'password1'的位置-不知道它们的确切位置,只是它们紧挨着一个,而password2是第一个 我已经通过一些冗长的列表订阅
['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
我想切换'password2'
和'password1'
的位置-不知道它们的确切位置,只是它们紧挨着一个,而password2
是第一个
我已经通过一些冗长的列表订阅完成了这一点,但我想知道是否有可能想出一些更优雅的东西?它怎么可能比
tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp
这只是使用临时存储的普通交换。简单的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])
如果您发现它更具可读性,许多人都会这样做。您可以使用以下示例:
>>> 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专家,但您可以尝试: 说 上面给出的o/p为:
res(1, 2) = (2,1)
因此,如果最后一个元素大于位于
i
位置的元素,则它们都会被交换。您的问题是在列表中查找“password2”的效率吗?“password1”能排在“password2”之前吗?这里是否有一些复杂的问题在你最初的问题中没有遇到?否则我同意@unwind。你应该发布你所拥有的——我很好奇你所说的“相当冗长的列表订阅”是什么意思;index2=索引(“密码2”);订单=订单[:index2]。追加(订单[index1])。追加(订单[index2])。追加(订单[index1+1:]);再多排几行。很好,不是。如果你真的想对它“Pythonic”,你也可以这样做:my_list[indexoftwd2]、my_list[indexoftwd2+1]=my_list[indexoftwd2+1]、my_list[indexoftwd2]
如果你想切换标题和邮件,第一个元素和第二个元素为什么不起作用?对不起,我现在明白了,i-1处没有元素,因此返回一个空列表,如果不知道要交换的键的位置,该列表将不起作用。
i = (1,2)
res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2))
res(1, 2) = (2,1)
for i in range(len(arr)):
if l[-1] > l[i]:
l[-1], l[i] = l[i], l[-1]
break