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?
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]
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")
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.
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.
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']
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 .
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)
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