web-dev-qa-db-fra.com

Comment changer la position de deux éléments dans une liste Python?

Je n’ai pas été en mesure de trouver une bonne solution à ce problème sur le net (probablement parce que switch, position, list et Python sont autant de mots surchargés).

C’est assez simple, j’ai cette liste:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']

Je voudrais changer la position de 'password2' et 'password1' - ne connaissant pas leur position exacte, mais simplement qu’ils sont côte à côte et que password2 est en premier.

J’ai accompli cela avec une liste assez longue d’inscriptions, mais je me demandais s’il était possible de proposer quelque chose de plus élégant.

166
mikl
    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]
328
samtregar

Le swap Python simple ressemble à ceci:

foo[i], foo[j] = foo[j], foo[i]

Maintenant, tout ce que vous avez à faire est d’imaginer ce que i est, et cela peut facilement être fait avec index:

i = foo.index("password2")
135
Can Berk Güder

Compte tenu de vos spécifications, j'utiliserais l'assignation de tranche:

>>> 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']

Le côté droit de l'assignation de tranche est une "tranche inversée" et pourrait également être orthographié:

L[i:i+2] = reversed(L[i:i+2])

si vous trouvez cela plus lisible, comme beaucoup le feraient.

15
Alex Martelli

Comment peut-il être plus long que

tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp

C'est juste un simple échange utilisant un stockage temporaire.

6
unwind
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

par conséquent, si le dernier élément est supérieur à l'élément à la position i, ils sont tous deux échangés.

0
ravi tanwar

vous pouvez utiliser par exemple:

>>> 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']
0
SmartElectron

Je ne suis pas un expert en python, mais vous pouvez essayer: 

i = (1,2)

res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2)) 

ci-dessus donnerait o/p comme:

res(1, 2) = (2,1)
0
lambzee

Hou la la! Il existe un moyen beaucoup plus standard (applicable à toutes les langues), simple et plus court!

x = i[2]; i[2] = i[3]; i[3] = x

Simple c'est mieux que complexe 

Note: Si vous ne connaissez pas la position:

index = list.index("password1")  # = 3 in the given list
0
Apostolos