2014-07-14 5 views
1

파이썬에서 목록을 역순으로 사용해야하고 reverse() 메소드가 제대로 작동한다는 것을 알고 있습니다. 그러나 작업을 수행하는 코드 조각을 우연히 발견했지만 완전히 이해할 수는 없습니다.목록의 항목 반전

이 목록을 반환하는 함수입니다.

def reverse(list): 
    for i in range(len(list) // 2): 
     list[i], list[len(list) -i -1] = list[len(list) -i -1], list[i] 

    return list 

왜 루프가 목록 길이의 절반을 차지합니까? 또한, 나는 세 번째 줄에있는 두 개의 쉼표를 이해하지 못합니다.

답변

6
def reverse(list): 
    for i in range(len(list) // 2): 
     print('Swapping {} and {}'.format(i, len(list) -i -1)) 
     # list[i], list[len(list) -i -1] = list[len(list) -i -1], list[i] 
    return list 


reverse(range(9)) 

당신에게 코드가 무엇을하고 있는지 아이디어를 제공한다

Swapping 0 and 8 
Swapping 1 and 7 
Swapping 2 and 6 
Swapping 3 and 5 

를 얻을 수 있습니다.


그것은

a, b = b, a 

이 변수 ab의 값을 교환합니다 알고하는 데 도움이됩니다. 과제물에 Python evaluates the right-hand side of the assignment first. 그런 다음 왼쪽에있는 변수에 값을 지정합니다.

그래서

list[i], list[len(list) -i -1] = list[len(list) -i -1], list[i] 

목록의 ilen(list)-i-1 인덱스 위치에서 개최 된 값을 교환한다. 이 같은 이름의 파이썬 내장 그림자 때문에 변수 list의 이름을 지정하는 방식으로


은 나쁘다.

2

오른손 크기가 여러 가지를 반환하는 경우 명령문의 왼쪽에있는 여러 요소에 할당 할 수 있습니다. 그것은뿐만 아니라 같은 기록 된 수 있습니다

list[i] = list[len(list)-i-1] 
list[len(list)-i-1] = list[i] 

그러나 위의 원자 적으로 실행됩니다. 순차적으로 위의 과정은 임시 변수가 필요하므로 아무 것도하지 않으므로 one-liner는 멋진 바로 가기입니다.

논리적으로 이것은 스왑입니다. 목록을 뒤집으려면 배열의 중간에 대해 요소를 바꿔서 배열을 바꾼다. 따라서 단지 최대 루프를 반복한다. len(list)/2

3

목록의 길이의 절반 만 반복하지만 각 루프마다 이동 중이다. 목록에있는 두 개의 개체. 튜플 패킹/언 패킹을 사용하여 한 줄의 코드에서 두 값을 서로 바꿉니다. 3 번째 줄은 본질적으로 ba에서 튜플을 생성 한 후 a에 첫 번째 멤버를 할당하고 b에 두 번째 멤버를 할당하는 a, b = b, a을 말합니다. 결과적으로 3 줄의 코드와 임시 변수를 사용하지 않고도 ab 스왑 값이됩니다.

1

이것은 두 끝에서 동시에 작동하기 때문에 목록의 절반 만 통과합니다.이 경우 쉼표 연산자를 사용하면 여러 변수에 할당 할 수 있으며,이 같은 노력하고 있습니다 : 그들이 그렇게 정말 기능은 처음과 마지막 요소로 시작, 거기서 뭐하는거야되어

a,b = b,a # now a has b's value and b has a's value 

이 그들을 스왑 , 두 번째와 두 번째 요소에서 두 번째 요소와 두 번째 요소로 넘어갑니다.

2

매번 두 항목을 스와핑하기 때문에 목록의 절반 만 통과하면됩니다. 첫 번째 및 마지막, 두 번째 및 두 번째 - 마지막, 등등. 따라서 목록의 가운데 항목에 도달하면 완료됩니다. 당신이 계속 간다면, 당신은 당신이했던 모든 것을 되돌리고, 그 각각의 아이템을 교환 할 것입니다. 쉼표가있는 라인에 대한

, 그것은 기본적으로 한 번에 여러 과제를 실행 단지 바로 가기이지만, 할당 대신 순차적으로 동시에 실행되는 추가 혜택과 함께,이 의미 것 같은 :

a, b = b+1, a+1 
a = b+1 
b = a+1 

a_new = b_old + 1b_new = a_new + 1 될 것이다 조작하면서 원하는

는 새로운 값 a_new = b_old + 1b_new = a_old + 1 될 것이다. 전자의 경우 두 문은 할당 전에 평가되지만 후자의 경우 각 행은 순차적으로 평가되므로 b 값을 업데이트하기 전에 a의 값이 변경됩니다.

스와핑 알고리즘의 경우, 순차가 아닌 동시에 (동시에) 두 값을 전환해야합니다. 첫 번째 값과 마지막 값을 생각하면 분명합니다. 동시에 교환하면 first_new = last_oldlast_new = first_old이됩니다. 순차적으로 바꾼 경우 first_new = last_oldlast_new = first_new = last_old이되므로 스왑이 작동하지 않습니다.

편집 : 예 : Python Tutorial where they use this notation can be found here.