1 분 소요

아래와 같이 5개의 알파벳을 담고 있는 리스트를 순회하며 출력하고 싶다면?

letters = ['A', 'B', 'C', 'D', 'E']

for문을 이용해 순서대로 접근할 수 있다.

for letter in letters:
  print(letter, end=' ') # A B C D E

그렇다면 역방향으로 순회하며 출력하고 싶다면 어떻게 해야할까?

reversed()

for letter in reversed(letters):
  print(letter, end=' ') # E D C B A

reversed() 내장 함수는 인자로 넘어온 리스트를 건드리지 않으며, 대신 리스트의 원소에 역방향으로 접근할 수 있는 “반복자”를 반환합니다.

만약에 루프를 돌지 않고 같은 원소들을 단지 역방향으로 담고 있는 새로운 리스트를 얻고 싶을 때는,
list() 함수를 이용하여 reversed() 함수가 반환해준 반복자를 한번에 소비(consume)해주면 됩니다.

print(reversed(letters)) # <list_reverseiterator object at 0x105dadf60>
print(list(reversed(letters))) # ['E', 'D', 'C', 'B', 'A']

리스트의 reverse() 와 비교

print(letters) # ['A', 'B', 'C', 'D', 'E']
letters.reverse()
print(letters) # ['E', 'D', 'C', 'B', 'A']

어떤 리스트를 상대로 reverse() 함수를 호출하면 실제로 해당 리스트에 변경을 가해진다는 것입니다.
즉, 리스트 내에 원소들 간에 자리가 서로 바뀌어서 리스트의 본래 구조를 잃어 버리게 됩니다.
따라서 리스트의 본래 구조를 보존해야하는 경우에는 reverse() 함수를 사용하면 절대 안됩니다.

range() 함수 이용

for i in range(len(letters)-1, -1, -1):
  print(letters[i], end=' ') # E D C B A

보시다시피 range() 함수를 써서 역방향으로 루프를 돌리면 코드가 읽기 어려워져 파이썬 커뮤니티에서는 그리 좋은 코딩 스타일로 보지 않습니다.

slicing 이용

for letter in letters[::-1]:
    print(letter, end=' ') # E D C B A

이 방법은 가독성 측면에서는 나쁘지는 않지만 메모리 사용량 측면에서 크게 추천하고 싶지 않은 방법이에요.
같은 원소를 역방향으로 담고 있는 동일한 크기의 리스트를 새로 만들기 때문에 불필요하게 추가 메모리를 소모하게 되기 때문입니다.

🌟 결론
메모리 사용량 측면에서 reversed() 함수를 추천한다 !!

참고



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: