파이썬 목록에서 두 항목의 위치를 ​​전환하는 방법은 무엇입니까?


208

나는 그물 에서이 문제에 대한 좋은 해결책을 찾지 못했습니다 (아마도 스위치, 위치, 목록 및 Python이 모두 과부하 된 단어이기 때문에).

다소 간단합니다.이 목록이 있습니다.

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

나는의 위치를 전환하고 싶습니다 'password2'그리고 'password1'그들은 바로 옆에 서로에게있어 유일한 것으로, 자신의 정확한 위치를 모르고 - password2처음이다.

나는 다소 오래 걸리는 목록 첨자 로이 작업을 수행했지만 조금 더 우아한 것을 생각 해낼 수 있을지 궁금해 했습니까?


문제가 목록에서 'password2'를 찾으려고하는 효율성입니까? 'password1'이 'password2'앞에 올 수 있습니까? 원래 질문에서 다루지 않는 약간의 복잡성이 있습니까? 그렇지 않으면 @unwind에 동의합니다.
브렌트 코드를 작성합니다

3
당신은 당신이 가진 것을 게시해야합니다-나는 "오래된 오래 된 목록 첨자"의 의미에 대해 궁금합니다.
samtregar

index1 = index ( 'password1') 라인을 따라 뭔가; index2 = 색인 ( '암호 2'); order = order [: index2] .append (order [index1]). append (order [index2]). append (order [index1 + 1 :]); 몇 줄 더 퍼져 예, 아니요
mikl

답변:


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

165

간단한 파이썬 스왑은 다음과 같습니다 :

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

이제 당신이해야 할 일은 무엇인지 파악하는 i것입니다 index.

i = foo.index("password2")

15

귀하의 사양이 주어지면 슬라이스 할당을 사용합니다.

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

슬라이스 할당의 오른쪽은 "반전 슬라이스"이며 철자를 지정할 수도 있습니다.

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

더 많은 것을 읽을 수 있다면,


첫 번째 요소 인 제목과 메일을 바꾸려면 왜 이것이 작동하지 않습니까?
Luigi Tiburzi

죄송합니다 지금은 빈 목록이 반환되도록 어떤 요소가 I-1에 없다, 이해
루이지 Tiburzi

7

어떻게 더 길어질 수 있을까

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

임시 저장소를 사용하는 단순한 스왑입니다.


13
당신이 정말로 그것에 대해 "Pythonic"이되고 싶다면, 당신은 항상 이렇게 할 수 있습니다 :my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
Brent Writes Code

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

마지막 요소가 위치의 요소보다 큰 경우 i둘 다 스왑됩니다.


-1

예를 들어 다음을 사용할 수 있습니다.

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

-1

나는 파이썬 전문가가 아니지만 시도해 볼 수 있습니다.

i = (1,2)

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

위와 같이 o / p를 줄 것이다 :

res(1, 2) = (2,1)

1
스왑 할 키의 위치를 ​​모르면 작동하지 않습니다.
mikl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.