问题:如何在Python列表中切换两项的位置?
我还没有在网上找到解决这个问题的好方法(可能是因为switch,position,list和Python都是这样的重载单词)。
这很简单–我有以下列表:
['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
我想切换位置,'password2'
并且'password1'
–不知道它们的确切位置,只知道它们彼此紧靠且排password2
在第一位。
我已经完成了一些比较漫长的列表下标操作,但是我想知道是否可以提出一些更优雅的方法?
I haven’t been able to find a good solution for this problem on the net (probably because switch, position, list and Python are all such overloaded words).
It’s rather simple – I have this list:
['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
I’d like to switch position of 'password2'
and 'password1'
– not knowing their exact position, only that they’re right next to one another and password2
is first.
I’ve accomplished this with some rather long-winded list-subscripting, but I wondered its possible to come up with something a bit more elegant?
回答 0
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]
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]
回答 1
简单的Python交换如下所示:
foo[i], foo[j] = foo[j], foo[i]
现在您所要做的就是弄清楚是什么i
,并且可以轻松地通过以下方法完成index
:
i = foo.index("password2")
The simple Python swap looks like this:
foo[i], foo[j] = foo[j], foo[i]
Now all you need to do is figure what i
is, and that can easily be done with index
:
i = foo.index("password2")
回答 2
根据您的规格,我将使用分片分配:
>>> 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])
如果您发现它更具可读性,那么它就会变得更多。
Given your specs, I’d use slice-assignment:
>>> 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']
The right-hand side of the slice assignment is a “reversed slice” and could also be spelled:
L[i:i+2] = reversed(L[i:i+2])
if you find that more readable, as many would.
回答 3
怎么会比
tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp
那只是使用临时存储的简单交换。
How can it ever be longer than
tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp
That’s just a plain swap using temporary storage.
回答 4
for i in range(len(arr)):
if l[-1] > l[i]:
l[-1], l[i] = l[i], l[-1]
break
结果,如果最后一个元素大于位置上的元素,i
那么它们都会被交换。
for i in range(len(arr)):
if l[-1] > l[i]:
l[-1], l[i] = l[i], l[-1]
break
as a result of this if last element is greater than element at position i
then they both get swapped .
回答 5
您可以使用例如:
>>> 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']
you can use for example:
>>> 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']
回答 6
我不是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)
I am not an expert in python but you could try:
say
i = (1,2)
res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2))
above would give o/p as:
res(1, 2) = (2,1)