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?
37 Answers
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] 0The 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") 0Given 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.
2How 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.
1for 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 .
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'] 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) 1