Jak zmienić pozycję dwóch pozycji na liście Pythona?

Nie udało mi się znaleźć dobrego rozwiązania tego problemu w sieci (prawdopodobnie dlatego, że switch, position, list i Python to takie przeciążone słowa).

To dość proste – mam taką listę:

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

Chciałbym zmienić pozycję 'password2' i 'password1' - nie znając ich dokładnej pozycji, tylko to, że są tuż obok siebie i password2 jest pierwszy.

Udało mi się to osiągnąć dzięki dość długofalowemu subskrybowaniu listy, ale zastanawiałem się, czy jest to możliwe masz coś bardziej eleganckiego?

Author: mikl, 2010-03-22

8 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]
 290
Author: samtregar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 16:31:49

Prosty Python swap wygląda tak:

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

Teraz wszystko, co musisz zrobić, to dowiedzieć się, czym jest i, a to można łatwo zrobić za pomocą index:

i = foo.index("password2")
 122
Author: Can Berk Güder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 16:30:05

Biorąc pod uwagę twoje specyfikacje, użyłbym 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']

Po prawej stronie przypisania slice jest "odwrócony slice" i może być również napisane:

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

Jeśli uznasz to za bardziej czytelne, tak jak wielu.

 15
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 16:35:28

Jak może być dłużej niż

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

To zwykła zamiana za pomocą tymczasowego magazynu.

 5
Author: unwind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 16:27:40

Możesz użyć na przykład:

>>> 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
Author: SmartElectron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
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

W wyniku tego, jeśli ostatni element jest większy niż element w pozycji i, to oba zostaną zamienione .

 0
Author: ravi tanwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 03:42:50

Nie jestem ekspertem w Pythonie, ale możesz spróbować: powiedz

i = (1,2)

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

Powyżej dałoby o / P jako:

res(1, 2) = (2,1)
 -1
Author: lambzee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-06 12:09:15

Wow! Istnieje znacznie bardziej standardowy (dotyczy wszystkich języków), prosty i krótszy sposób!

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

Proste jest lepsze niż złożone

Uwaga: Jeśli nie znasz pozycji:

index = list.index("password1")  # = 3 in the given list
 -2
Author: Apostolos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-13 22:09:40