YOGYUI

Python - list 요소 뒤집기 (reverse list elements) 본문

Software/Python

Python - list 요소 뒤집기 (reverse list elements)

요겨 2021. 8. 20. 10:36
반응형

 

Python 코딩할 때 자주 활용하는 자료구조 중 하나인 list의 요소들을 뒤집는 방법을 알아보자

(은근히 쓸데가 많다)

참고: 모든 코드는 python 3.x에서 작성되었다

1. 리스트 객체 자체를 뒤집기

list 객체의 reverse 메서드를 사용하면 된다

 

예를 위해 리스트 객체를 하나 생성한다

a = [1, 2, 3, 4, 5]
In [1]: print(a)
Out[1]: [1, 2, 3, 4, 5]

이제 뒤집어보자

a.reverse()
In [2]: print(a)
Out[2]: [5, 4, 3, 2, 1]

간단하게 요소를 뒤집을 수 있다

그런데 리스트 객체 자체가 바뀌는 것이기 때문에, 원본 리스트를 그대로 남겨두고자 하는 경우에는 적절한 구현 방식이 아니다 (나도 이 방식은 거의 쓰지 않는다)

 

2. 뒤집은 리스트 객체를 반환하기

2.1. reversed built-in 함수 이용하기

출처: https://docs.python.org/3/library/functions.html#reversed

내장함수를 이용해서 이터레이터를 반환하는 구현방식이 있다

a = [1, 2, 3, 4, 5]
b = reversed(a)
In [3]: b
Out[3]: <list_reverseiterator object at 0x000001A668FB7A90>

In [4]: type(b)
Out[4]: <class 'list_reverseiterator'>

list_reverseiterator 객체가 반환되는데, 딱히 복잡하게 생각할 것 없이 list로 치환할 수 있다

c = list(b)
In [5]: print(c)
Out[5]: [5, 4, 3, 2, 1]

In [6]: print(a)
Out[6]: [1, 2, 3, 4, 5]

원본 리스트 객체가 유지된 것을 알 수 있다

이렇게 구현해도 상관없지만, pythonic하지 않을 뿐더러 코드가 지저분한 느낌이 든다

 

2.2. 리스트 슬라이싱 (slice list)

이 방법이 핵심이다

a = [1, 2, 3, 4, 5]
b = a[::-1]
In [7]: print(b)
Out[7]: [5, 4, 3, 2, 1]

In [8]: print(a)
Out[8]: [1, 2, 3, 4, 5]

::-1 로 한방에 해결된다

 

슬라이싱 방식은 str 문자열 객체에도 동일하게 적용할 수 있다

In [9]: "YOGYUI"[::-1]
Out[9]: 'IUYGOY'

간단하게 원리를 설명하면 slicing 시 콜론(:)을 두 개 사용하면 C/C++의 for 문과 유사하게 시작/끝/스텝을 지정하게 된다

 

a[start:end:step]

 

Python은 C/C++과는 다르게 음수 입력을 통해 iterable 객체의 가장 끝 요소부터 인덱싱할 수 있다

In [10]: print(a[-1], a[-2], a[-3], a[-4], a[-5])
Out[10]: 5 4 3 2 1

따라서 ::-1 구문을 굳이 for문으로 구현해보면 다음과 같다

def my_reverse(input: list):
    output = list()
    for i in range(1, len(input) + 1):
        output.append(input[-i])
    return output

(인덱싱/슬라이싱에 대한 자세한 설명은 꽤 길어질 수 있으니 기회가 되면 다른 포스트에서 다루도록 한다)

 

 

생각보다 쓸 데가 많으니 외워두고 요긴하게 사용하도록 하자

 

끝~!

반응형