Python List 뒤집기 reverse reversed 차이점

반응형
반응형

Python은 List를 거꾸로 뒤집는 reverse() reversed() 내장함수를 따로 제공합니다. 

언뜻 보면 비슷해 보이는 내장함수지만, 설계상 큰 차이가 존재합니다.

이번 포스팅에서는 reverse() reversed( ) 메서드를 이용해 리스트를 거꾸로 뒤집는 방법과, 예제 그리고 reverse() reversed() 메서드의 차이점에 대해서 정리해 보고자 합니다. 

 

💡INDEX

#1 reverse method

#2 reversed method

#2.1 reversed method는 iterator를 반환한다.

#2.2 reversed method wit for loop

#2.3 reversed method with tuple & list

#2.4 reversed method with string


#1 reverse method

reverse() 함수List의 순서를 거꾸로 뒤집는 Python 내장 함수입니다. 

(다른 Sequence 자료형 Tuple, String, Dictionary 등에서 사용이 불가능하고, 오로지 List 에서만 사용 가능합니다.)

사용 방법 : 뒤집을 리스트 변수명.reverse()

myList = [1, 2, 3, 4, 5]
myList.reverse()
print(myList)
Output
[5, 4, 3, 2, 1]

 

단, 유의 해야할 점이 있습니다. 다음 Python reverse 함수 내부 구현 코드를 보면 알 수 있듯이, reverse 함수return 값이 None 입니다. 즉, 변경된 리스트 복사본을 리턴해 주는 것이 아닌 원본 리스트의 값을 직접 바꾼다는 것 입니다. 

따라서 원본 리스트의 변경이 일어나면 안되는 상황이라면 reverse 함수를 사용 해서는 안됩니다. 

# reverse 함수 내부 구현 코드
def reverse(self) -> None:
    """
    Reverse the order of the elements in the list in place.
    """
    n = len(self)
    for i in range(n // 2):
        self[i], self[n-i-1] = self[n-i-1], self[i]

 

* Return 값이 None이기에, 리스트가 아닌 None을 출력

myList = [1, 2, 3, 4, 5]
print(myList.reverse())
Output
None

#2 reversed method

reversed 함수reverse 함수와 달리 List 자료형 뿐 만 아니라 다른 반복 가능한 Iterable Object 시퀀스 자료형 (Tuple, String, Dictionary ..) 에서 모두 사용 가능합니다. reversed 함수 또한 Iterable Object를 뒤집는 기능을 수행하며, iterator를 반환합니다. 즉, reversed 함수는 원본 객체에 영향을 끼치지 않습니다. 

사용 방법 : reversed(뒤집을 리스트 변수명)

# 원본 객체 (myList)에 영향을 끼치지 않는다.
myList = [1, 2, 3, 4, 5]
newList = reversed(myList)
print(f"myList → {myList}")
print(f"newList → {newList}")

 

#2.1 reversed method는 iterator를 반환한다. 

다음 출력 결과를 보시면 원본 객체인 myList의 값은 변경되지 않았음을 확인 가능합니다.

또한 reversed 메서드를 사용해 리스트를 뒤집은 새로운 객체는 iterator를 반환 했습니다. 

myList → [1, 2, 3, 4, 5]
newList → <list_reverseiterator object at 0x7fd450fee390>

 

#2.2 reversed method with for loop

reversed method의 반환값은  iterator 이기에 for loop 와 함께 사용할 수 있습니다. 

# List
print("List")
myList = [1, 2, 3, 4, 5]
for i in reversed(myList):
    print(i, end="")
    
# String
print("\nString")
myString = "novDev"
for c in reversed(myString):
    print(c, end="")
[출력결과]
List
54321
String
veDvon

 

#2.3 reversed method with list & tuple

reversed 메서드는 뒤집힌 객체 그 자체가 아닌 iterator object를 반환하기에, list, tuple .. 등과 같은 자료형 변환 메서드를 사용해 사용하고자 하는 타입의 객체로 타입을 변환을 해 주어야 합니다. 

# List
myList = [1, 2, 3, 4, 5]
newList = list(reversed(myList))
print(f"myList → {myList}")
print(f"newList → {newList}")

# Tuple
myTuple = (1, 2, 3, 4, 5)
newTuple = tuple(reversed(myTuple))
print(f"myTuple → {myTuple}")
print(f"newTuple → {newTuple}")
myList → [1, 2, 3, 4, 5]
newList → [5, 4, 3, 2, 1]
myTuple → (1, 2, 3, 4, 5)
newTuple → (5, 4, 3, 2, 1)

 

#2.4 reversed method with string 

str 함수매개변수로 보낸 객체를 str object로 변환해 주는 함수이지만, reversed object 는 예외로 str object 로 변환 시켜 주지 못합니다. 

이는 reversed object가 앞서 정리 했듯이 iterator object이기 때문인데 iterator는 객체의 원소를 하나씩 제공하는 객체로, 다음 값을 제공하기 위해서 반복자를 계속 유지하는 특징이 있습니다.

따라서 iterator object는 str 함수를 이용해 문자열로 변환할 수 없습니다. 

그렇기에 reversed method를 사용해 string을 뒤집고 싶다면 str 함수가 아닌 join 함수를 사용해야 합니다.

# String
myString = "novDev"
newString = "".join(reversed(myString))
print(f"myString → {myString}")
print(f"newString → {newString}")
Output
myString → novDev
newString → veDvon

#정리

1. reverse 메서드는 list object 에서만 사용 가능한 list 전용 함수로 반환값이 존재하지 않고 원본 객체를 직접 변경 하기에 사용에 주의가 필요하다.

2. reversed 메서드는 list 뿐 만 아니라 다른 시퀀스 자료형 에서 모두 사용 가능하다.

3. reversed 메서드는 반환값으로 iterator를 리턴하기에 원하는 형태로 사용하기 위해서 list, tuple, join 등 과 같은 함수를 추가로 사용해 원하는 객체로 변경해 주어야 한다. 

 

* 본 포스팅은 개인적인 공부 내용을 기록하기 위해서 작성한 포스팅 입니다.

혹여나 잘못된 내용이 있다면 댓글로 남겨주시면 바로 수정 하도록 하겠습니다. 

반응형

댓글

Designed by JB FACTORY