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

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

C'est plutôt simple-j'ai cette liste:

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

Je voudrais changer de position de 'password2' et {[2–} - ne connaissant pas leur position exacte, seulement qu'ils sont juste à côté de l'autre et password2 est le premier.

J'ai accompli cela avec une liste d'inscription assez longue, mais je me demandais s'il était possible de venir avec quelque chose d'un peu plus élégante?

146
demandé sur mikl 2010-03-22 19:25:14

8 réponses

    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]
290
répondu samtregar 2010-03-22 16:31:49

Le simple échange Python ressemble à ceci:

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

Maintenant, tout ce que vous devez faire est de trouver ce que i est, et qui peut facilement être fait avec index:

i = foo.index("password2")
122
répondu Can Berk Güder 2010-03-22 16:30:05

Compte tenu de vos spécifications, j'utiliserais 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']

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

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

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

15
répondu Alex Martelli 2010-03-22 16:35:28

Comment peut-il jamais être plus long que

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

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

5
répondu unwind 2010-03-22 16:27:40

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
répondu SmartElectron 2016-03-20 07:58:10
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

À la suite de cela, si le dernier élément est supérieur à l'élément à la position i, Ils sont tous deux échangés .

0
répondu ravi tanwar 2018-08-15 03:42:50

Je ne suis pas un expert en python mais vous pourriez essayer: dites

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)
-1
répondu lambzee 2016-08-06 12:09:15

Wow! Il y a un moyen beaucoup plus standard (applicable à toutes les langues), simple et plus court!

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

Simple vaut mieux que complexe

Remarque: Si vous ne connaissez pas la position:

index = list.index("password1")  # = 3 in the given list
-2
répondu Apostolos 2018-05-13 22:09:40