如何切换Python列表中的两个项目的位置?
我一直没有find一个很好的解决scheme在networking上的这个问题(可能是因为开关,位置,列表和Python都是如此重载的话)。
这很简单 – 我有这个列表:
['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
我想切换'password2'
和'password1'
位置 – 不知道它们的确切位置,只是它们紧挨着, password2
是第一位。
我已经完成了一些相当冗长的列表下标,但我想知道有可能提出一些更优雅的东西?
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]
简单的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])
如果你发现更多的可读性,尽可能多。
它怎么会比这更长
tmp = my_list[indexOfPwd2] my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1] my_list[indexOfPwd2 + 1] = tmp
这只是一个简单的交换使用临时存储。
你可以使用例如:
>>> 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的专家,但你可以尝试:说
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)