我还没能在网上找到一个很好的解决这个问题的方法(可能是因为switch, position, list和Python都是重载的单词)。
其实很简单——我有这样一个列表:
['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
我想切换“password2”和“password1”的位置-不知道它们的确切位置,只知道它们紧挨着彼此,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']